2009-03-05 57 views
10

我在使用Activator类来访问程序集中的资源,否则我会创建一个循环引用(依赖注入)。我之前用香草类做过,我需要参考,但我的问题是:我可以使用Activator访问静态类吗?激活器和静态类

绊倒我的部分是激活器返回对象的实例,而静态类没有实例。这可能吗?

回答

18

您不需要激活器来调用该方法。您直接使用MethodInfo.Invoke。第一个参数可以留空。

0

这不是说静态类没有实例,它只是没有任何公共构造函数。激活使用反射来创建实例,当你使用反射,你可以

0

如果你的意思是说“资源”打电话给你想要的任何东西,甚至是私有的构造是嵌入在装配事实上的资源,你可以随时手动提取它们(请参阅Assembly.GetManifestResourceStream()),而不使用静态类(因为您可以使用它们的唯一方式纯粹是反射),所以会出现更多问题。

Spring.NET有一个不错的IResource抽象。

而且不,Activator不能用于“创建”静态类。

14

GVS是正确的 - 这里是使用的例子:

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的代码示例更多例子,我是懒得关键在 – GvS 2009-03-05 14:15:42

4

一个使用MethodInfo.Invoke

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