class.forName 在不创建实例的情况下在 C# 中等效

class.forName equivalent in c# without creating an instance

我想像Javaclass.forName()那样在c#中动态访问classes。我只找到了 Class.forName() equivalent in .NET? 之类的东西,但我不想创建实例。

详细说明:我有一个包含 classes 列表的简单文本文件。我使用 file.ReadLine() 读取它们(所以我得到了所有 class 名称作为字符串)然后我想在每个 class: class1.method(); class2.method; 上执行相同的静态方法等等. classes 都存在,我需要访问它们。我该怎么做?

您可以使用 System.Reflection 将程序集加载到内存中,然后深入到类型,然后获取所需的方法并调用。

参考文档

GetMethod

如果您有想要的名字 Type 那么您可以使用 Type.GetType(string) 方法。
例如,如果您有这样的 class:

namespace MeProgram.BusinessLogic
{
    public class MeObject {}
}

该对象的完整 class 名称应为 "MeProgram.BusinessLogic.MeObject"

现在您可以在 Type.GetType(string) 方法中使用该名称,如下所示:

string className = "MeProgram.BusinessLogic.MeObject";
Type classType = Type.GetType(className);

C# 不支持静态接口(或接口中的静态成员),因此除非您想使用工厂 类(通常的方法),否则您需要使用反射来调用静态方法直接。

void Main()
{

  Console.WriteLine(Type.GetType("A").GetMethod("Hi").Invoke(null, new object[] {}));
}

class A
{
  public static string Hi() { return "Hi!"; }
}

您可能希望为该类型使用完全限定的名称以使其工作得非常好。仅使用类型的名称很棘手,尤其是当您尝试从其他程序集调用类型时(您可能是这样,否则没有理由使用反射 - 只需使用委托字典或其他任何东西)。