使用类名作为字符串调用泛型类型的方法

时间:2015-11-17 16:25:10

标签: c# generics reflection eval

有这个课程:

class ClassA{
}

以及具有此签名的方法:

void MyMethod<T>();

我们所有人都以这种方式使用它:

MyMethod<ClassA>();

但是......有一些机会调用MyMethod将类名作为字符串吗?即:

var className = "ClassA";

MagicMethod($"MyMethod<{className}>();");

我在JavaScript中谈论了一些等同的Eval。反思?,有什么想法吗?

我搜索了一些类似DynamicExpresso的库,但没有支持泛型类型。

关于可能的重复:

1 个答案:

答案 0 :(得分:4)

提供以下方法:

public class Foo
{
     public void MyMethod<T>();
}

您可以获得MethodInfo

MethodInfo methodInfo = typeof(Foo).GetMethod("MyMethod");

现在,让我们说你有这个课程:

public class exampleB
{
}

您可以使用泛型参数类型的名称调用泛型方法:

string genericTypeName = "exampleB";
Type genericType = Type.GetType(genericTypeName);
MethodInfo methodInfo = typeof(Foo).GetMethod("MyMethod").MakeGenericMethod(genericType);

// You will need an instance of Foo to invoke it (the method isn't static)
methodInfo.Invoke(fooInstance, null);

当然,这需要运行时搜索类型B,所以你应该小心并指定正确的命名空间。