2009-03-05 26 views
10

Estoy considerando la idea de usar la clase Activator para obtener acceso a recursos en un ensamblado que de lo contrario crearía una referencia circular para (inyección de dependencia). Lo he hecho antes con las clases de vanilla a las que necesitaba una referencia, pero mi pregunta es: ¿puedo usar el Activador para acceder a una clase estática?Activador y clases estáticas

La parte que me está molestando es que el activador le devuelve una instancia del objeto, mientras que una clase estática no tiene instancia. es posible?

Respuesta

18

No necesita el Activador para llamar al método. Usted usa MethodInfo.Invoke directamente. El primer parámetro se puede dejar nulo.

0

No es que la clase estática no tenga instancia, es solo que no tiene ningún constructor público. El activador usa la reflexión para crear instancias, y cuando usa la reflexión puede llamar a cualquier cosa, incluso constructores privados

0

Si lo que quiere decir con decir "recursos" es en realidad recursos incrustados en el ensamblaje, siempre puede extraerlos manualmente (vea Assembly.GetManifestResourceStream()), sin usar clases estáticas (habrá más problemas con ellas ya que la única manera en que puede usarlas es puramente con reflexión).

Spring.NET tiene una bonita abstracción de IResource.

Y no, Activator no se puede utilizar para "crear" clases estáticas.

14

GVS es correcta - aquí es un ejemplo del 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"; } 
} 
+1

+1 para el ejemplo de código, que soy demasiado perezoso para llave en – GvS

4

Un ejemplo más con MethodInfo.Invoke

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