激活器和静态类

发布于 2024-07-14 12:07:36 字数 171 浏览 10 评论 0原文

我正在考虑使用 Activator 类来访问程序集中的资源,否则我会为其创建循环引用(依赖项注入)。 我之前已经使用需要引用的普通类完成了此操作,但我的问题是:我可以使用 Activator 来访问静态类吗?

让我困惑的部分是激活器返回给您对象的实例,而静态类没有实例。 这可能吗?

I'm tossing around the idea of using the Activator class in order to get access to resources in an assembly that I would otherwise create a circular reference for (dependency injection). I've done it before with vanilla classes that I needed a reference to, but my question is: can I use the Activator to get access to a static class?

The part that's tripping me up is that the Activator returns to you a instance of the object, whereas a static class has no instance. Is this possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

放低过去 2024-07-21 12:07:36

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

You do not need the Activator to call the method. You use MethodInfo.Invoke directly. The first parameter can be left null.

赠意 2024-07-21 12:07:36

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"; }
}

GvS is correct - here is an example of the usage:

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"; }
}
初相遇 2024-07-21 12:07:36

使用 MethodInfo.Invoke 的另一个示例

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

One more example using MethodInfo.Invoke

Type myStaticClassType = Type.GetType("MyStaticClassNameSpace",true);
object[] myStaticMethodArguments = {object1,object2...};
MethodInfo myStaticMethodInfo = myStaticClassType.GetMethod("YourMethod");
var myStaticMethodResult = myStaticMethodInfo.Invoke(null,myStaticMethodArguments);
山人契 2024-07-21 12:07:36

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

It is not that static class has no instance, it's just it doesn't have any public constructors. Activator uses reflection to create instances, and when you use reflection you can call anything you want, even private constructors

山色无中 2024-07-21 12:07:36

如果您所说的“资源”实际上是嵌入在程序集中的资源,那么您始终可以手动提取它们(请参阅Assembly.GetManifestResourceStream()),而无需使用静态类(会有更多问题)因为使用它们的唯一方法就是纯粹通过反射)。

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

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

If what you mean by saying "resources" is in fact resources embedded in the assembly, you can always extract them manually (see Assembly.GetManifestResourceStream()), without using static classes (there will be more problems with those since the only way you can use them is purely with reflection).

Spring.NET has a nice IResource abstraction.

And no, Activator cannot be used to "create" static classes.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文