C#反思:如何从字符串获取类引用?


89

我想用C#做到这一点,但是我不知道怎么做:

我有一个带有类名-eg:的字符串,FooClass并且我想在该类上调用一个(静态)方法:

FooClass.MyMethod();

显然,我需要通过反射找到对该类的引用,但是如何呢?

Answers:


124

您将要使用该Type.GetType方法。

这是一个非常简单的示例:

using System;
using System.Reflection;

class Program
{
    static void Main()
    {
        Type t = Type.GetType("Foo");
        MethodInfo method 
             = t.GetMethod("Bar", BindingFlags.Static | BindingFlags.Public);

        method.Invoke(null, null);
    }
}

class Foo
{
    public static void Bar()
    {
        Console.WriteLine("Bar");
    }
}

我说简单是因为用这种方法很容易找到同一程序集内部的类型。请参阅乔恩的答案,以获取有关您需要了解的更详尽的解释。检索类型后,我的示例将向您展示如何调用该方法。


101

您可以使用Type.GetType(string),但是您需要知道完整的类名称,包括名称空间,如果它不在当前程序集或mscorlib中,则需要使用程序集名称。(理想情况下,请Assembly.GetType(typeName)改用-在正确找到程序集引用方面,我发现这更容易!)

例如:

// "I know String is in the same assembly as Int32..."
Type stringType = typeof(int).Assembly.GetType("System.String");

// "It's in the current assembly"
Type myType = Type.GetType("MyNamespace.MyType");

// "It's in System.Windows.Forms.dll..."
Type formType = Type.GetType ("System.Windows.Forms.Form, " + 
    "System.Windows.Forms, Version=2.0.0.0, Culture=neutral, " + 
    "PublicKeyToken=b77a5c561934e089");

1
+1做得很好-我添加了一个答案,该答案显示检索类型后如何使用它。如果愿意,请继续,将我的示例合并到您的答案中,我将删除我的示例。
Andrew Hare

鉴于您的信息已经被接受,我建议我们采用另一种方式-将您的内容添加到您的答案中,然后我将其删除:)
Jon Skeet

4
只是为了进一步扩展您的答案,如果您不确定要将什么作为文本传递给GetType函数,并且可以访问此类,然后查看typeof(class).AssemblyQualifiedName,这将给您一个清晰的主意。
techExplorer 2012年

10

一个简单的用法:

Type typeYouWant = Type.GetType("NamespaceOfType.TypeName, AssemblyName");

样品:

Type dogClass = Type.GetType("Animals.Dog, Animals");

7

回复的时间有点晚,但这应该可以解决问题

Type myType = Type.GetType("AssemblyQualifiedName");

您的程序集合格名称应如下所示

"Boom.Bam.Class, Boom.Bam, Version=1.0.0.262, Culture=neutral, PublicKeyToken=e16dba1a3c4385bd"

4
感谢您明确阐明程序集限定名称的外观。
提请

3

通过Type.GetType您可以获取类型信息。您可以使用此类获取方法信息,然后调用该方法(对于静态方法,将第一个参数保留为null)。

您可能还需要程序集名称才能正确识别类型。

如果类型在当前正在执行的程序集中或在Mscorlib.dll中,则只需提供其名称空间限定的类型名称即可。


0

我们可以用

Type.GetType()

获取类名,也可以使用创建它的对象 Activator.CreateInstance(type);

using System;
using System.Reflection;

namespace MyApplication
{
    class Application
    {
        static void Main()
        {
            Type type = Type.GetType("MyApplication.Action");
            if (type == null)
            {
                throw new Exception("Type not found.");
            }
            var instance = Activator.CreateInstance(type);
            //or
            var newClass = System.Reflection.Assembly.GetAssembly(type).CreateInstance("MyApplication.Action");
        }
    }

    public class Action
    {
        public string key { get; set; }
        public string Value { get; set; }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.