Pergunta

Estou lançando em torno da idéia de usar a classe Activator a fim de obter acesso aos recursos em uma montagem que, de outra forma criar uma referência circular para (injeção de dependência). Já fiz isso antes com aulas de baunilha que eu precisava de uma referência a, mas a minha pergunta é: posso usar o Ativador para obter acesso a uma classe estática

A parte que está me tropeçar é que os retornos Activator para você um exemplo do objeto, enquanto uma classe estática tem nenhuma instância. Isso é possível?

Foi útil?

Solução

Você não precisa do Activator para chamar o método. Você usa MethodInfo.Invoke diretamente. O primeiro parâmetro pode ser deixado nulo.

Outras dicas

GVS está correta - aqui está um exemplo do uso:

using System;
using System.Reflection;

class Program
{
    static void Main()
    {
        Type type = Type.GetType("Foo");
        MethodInfo info = type.GetMethod("Bar");

        Console.WriteLine(info.Invoke(null, null));
    }
}

static class Foo
{
    public static String Bar() { return "Bar"; }
}

Mais um exemplo usando MethodInfo.Invoke

Type myStaticClassType = Type.GetType("MyStaticClassNameSpace",true);
object[] myStaticMethodArguments = {object1,object2...};
MethodInfo myStaticMethodInfo = myStaticClassType.GetMethod("YourMethod");
var myStaticMethodResult = myStaticMethodInfo.Invoke(null,myStaticMethodArguments);

Não é que classe estática tem nenhuma instância, é só ele não tem nenhum construtores públicos. Activator usa a reflexão para criar instâncias, e quando você usa reflexão você pode chamar o que quiser, mesmo construtores privados

Se o que você quer dizer com "recursos" é em recursos fatos embutidos na montagem, você sempre pode extraí-los manualmente (ver Assembly.GetManifestResourceStream()), sem usar classes estáticas (não haverá mais problemas com aqueles já que a única maneira que você puder usá-los é puramente com reflexão).

Spring.NET tem um bom IResource abstração.

E não, Activator não pode ser usada para "criar" classes estáticas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top