Activator e classes estáticas
-
03-07-2019 - |
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?
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.