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

时间:2009-06-25 15:03:56

标签: c# reflection

我想在C#中这样做,但我不知道如何:

我有一个带有类名-e.g:FooClass的字符串,我想在这个类上调用(静态)方法:

FooClass.MyMethod();

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

6 个答案:

答案 0 :(得分:111)

您需要使用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");
    }
}

我说简单因为很容易找到同一个程序集内部的类型。有关您需要了解的内容,请参阅Jon's answer以获得更详尽的说明。检索完该类型后,我的示例将向您展示如何调用该方法。

答案 1 :(得分:88)

您可以使用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");

答案 2 :(得分:7)

一个简单的用途:

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

样品:

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

答案 3 :(得分:5)

迟到的回复,但这应该做的伎俩

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

您的程序集限定名称应该是这样的

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

答案 4 :(得分:3)

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

您可能还需要Assembly name来正确识别类型。

  

如果类型在当前   执行程序集或在Mscorlib.dll中,   提供这种类型就足够了   名称由其名称空间限定。

答案 5 :(得分: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; }
    }
}