2017-05-09 90 views
-4

我想以类似Java class.forName()的方式动态访问c#中的类。我只找到Class.forName() equivalent in .NET?之类的东西,但我不想创建实例。在c#中等效的class.forName没有创建实例

详细:我有一个简单的文本文件,其中包含一个类的列表。我使用file.ReadLine()(因此我已将所有类名称作为字符串)读取它们,然后我想对每个类执行相同的静态方法:class1.method(); class2.method;等等。这些类都存在,我需要访问它们。我怎样才能做到这一点?

+0

你试过'static'关键字吗? https://docs.microsoft.com/en-us/dotnet/articles/csharp/language-reference/keywords/static – Stefan

+0

尝试使用System.Reflection。您可能需要通过加载Assembly并执行传入Flags的GetMethod来检索所需的方法并执行它,以获取MethodInfo。 – Gururaj

+1

@Pikoh _I我想对每个类执行相同的静态方法_ – juharr

回答

3

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

void Main() 
{ 

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

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

您可能想要使用该类型的完全限定名称使其工作得很好。只使用类型的名称是非常棘手的,特别是当你试图从其他程序集中调用类型时(你可能是这样,否则没有理由使用反射 - 只需使用代表字典或其他)。

+0

谢谢。这似乎是我需要的。问题是在执行期间总是有NullReferenceException,尽管我确信这个类(你称之为“A”)存在。它也发生在像Console.WriteLine(Type.GetType(“A”)。ToString())这样简单的片段上,所以我认为问题出现在getType()方法中。附加信息显示“未在对象实例上设置对象引用”。我不明白,因为我不需要/不想要一个实例(并且我的方法是静态的!) – user5325622

+0

@ user5325622您不需要您的类型的实例,但您确实需要“Type”实例类型 - GetType在没有找到类型时返回null。这就是为什么我提到你可能需要使用一个更合格的名称,而不仅仅是“A” - 一个完整的或程序集限定的名称。您可以使用'typeof(A).AssemblyQualifiedName'来查看该类型的程序集限定名称。如果你只是把我的示例代码放在你的'Program'类中,'A'将会是一个嵌套类并且在一个名字空间中,所以你至少需要像'TestApp.Program + A'这样的东西。 – Luaan

+0

谢谢。这对硬编码的类名很有用。但是上面描述的具体情况如何:“我有一个包含类的列表的简单文本文件(所以我已将所有类名称作为字符串)”?当我只将类名作为字符串而不是类本身时,我无法明确地确定类的类型。 – user5325622

0

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

参考文档

GetMethod

0

如果你有你想要的Type那么你可以使用Type.GetType(string)方法的名称。
例子,如果你有一类这样的:该对象的

namespace MeProgram.BusinessLogic 
{ 
    public class MeObject {} 
} 

完整的类名称应"MeProgram.BusinessLogic.MeObject"

现在你可以使用这个名字Type.GetType(string)方法里面像这样:

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