如何从MethodInfo MakeGenericMethod的字符串中获取类类型

时间:2014-07-23 06:27:41

标签: c# reflection

我在C#中使用Reflection非常缺乏经验,因此我尝试按照官方示例here来掌握事情的运作方式。为了使这更接近我的真实世界,我已经改变了一些代码:

public class Example
{
    public static void Generic<T>(T toDisplay)
    {
        Console.WriteLine("\r\nHere it is: {0}", toDisplay);
    }
}
class Program
{
    public static void Main()
    {
        RefTests rt = new RefTests();
        rt.ExecuteMethodWithReflection();
    }
}

public class RefTests
{ 
    public void ExecuteMethodWithReflection()
    {
        //Type myType = typeof(Example);
        Type argType = Type.GetType("System.Int32");
        Type myType = Type.GetType("Example");
        MethodInfo method = myType.GetMethod("Generic");
        MethodInfo generic = method.MakeGenericMethod(argType);
        object[] args = { 42 };
        generic.Invoke(null, args);
    }
}

这里的问题在于ExecuteMethodWithReflection()方法。在最初的示例中,它显示了定义方法的类的类型如下所示:

Type myType = typeof(Example);

然而,在我的真实情况中,Example将是一个字符串,我需要将其转换为类类型Example,您可以看到:

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

但问题在于myTypenull而在edn我因此而异常。我尽量让事情变得简单。从我的示例中可以看出,所有类都在一个文件中,共享相同的命名空间。我怎么修改我的代码所以我可以使用字符串来获得这种类型?

1 个答案:

答案 0 :(得分:3)

您需要指定类型的全名,包括命名空间:

Type myType = Type.GetType("ConsoleApplication1.Example");

int的示例有效,因为您还指定了名称空间"System.Int32"。如果仅提供"Int32",则会返回null

Sriram Sakthivel 注意到的那样,没有汇编限定名称的Type.GetType仅适用于

  

在当前正在执行的程序集中或在Mscorlib.dl中

否则 - 您需要提供该类型的程序集限定名称。

修改 为了获得类型,你可以这样做:

Assembly assm = Assembly.GetExecutingAssembly();
//Assembly assm = Assembly.GetCallingAssembly();
//Assembly assm   = Assembly.GetEntryAssembly();
//Assembly assm = Assembly.Load("//");
// it depends in which assmebly you are expecting the type to be declared

// Single protects us - if more than one "Example" type will be found (with different namespaces)
// throws exception (we don't know which type to use)
// when null - type not found
Type myType = assm.GetTypes().SingleOrDefault(type => type.Name.Equals("Example"));