13

我正在折腾使用 Activator 类来访问程序集中的资源的想法,否则我会为(依赖注入)创建循环引用。我以前使用需要引用的 vanilla 类来完成它,但我的问题是:我可以使用 Activator 来访问静态类吗?

让我失望的部分是激活器返回给你一个对象的实例,而静态类没有实例。这可能吗?

4

5 回答 5

24

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

于 2009-03-05T14:04:41.993 回答
16

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"; }
}
于 2009-03-05T14:09:50.810 回答
7

另一个使用 MethodInfo.Invoke 的示例

Type myStaticClassType = Type.GetType("MyStaticClassNameSpace",true);
object[] myStaticMethodArguments = {object1,object2...};
MethodInfo myStaticMethodInfo = myStaticClassType.GetMethod("YourMethod");
var myStaticMethodResult = myStaticMethodInfo.Invoke(null,myStaticMethodArguments);
于 2015-02-19T16:10:03.167 回答
0

不是静态类没有实例,只是它没有任何公共构造函数。Activator 使用反射来创建实例,当你使用反射时你可以调用任何你想要的东西,甚至是私有构造函数

于 2009-03-05T14:05:50.120 回答
0

如果您所说的“资源”实际上是嵌入在程序集中的资源,那么您总是可以手动提取它们(请参阅 参考资料Assembly.GetManifestResourceStream()),而不使用静态类(这些会出现更多问题,因为您可以使用它们的唯一方法是纯粹带反射)。

Spring.NET 有一个很好的IResource抽象。

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

于 2009-03-05T14:08:18.600 回答