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



我对在c#中使用反射相当缺乏经验,所以我尝试遵循这里的官方示例来掌握事情是如何工作的。为了使它更接近我的真实世界场景,我对代码进行了一些更改:

public class Example
{
    public static void Generic<T>(T toDisplay)
    {
        Console.WriteLine("rnHere 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 az,您可以看到:

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

但是这里的问题是myTypenull,在最后我得到例外,因为这一点。我尽量让事情变得简单。从我的示例中可以看到,所有类都在一个文件中,共享相同的名称空间。我应该如何修改我的代码,使我可以使用字符串来获得这种类型?

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

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"));

相关内容

  • 没有找到相关文章

最新更新