使用具有类的限定名称的字符串调用泛型模糊方法

时间:2015-12-11 17:35:44

标签: c# .net generics reflection .net-4.5.2

假设我有第三方类Foo,其签名如下:

void Execute<T>();
void Execute(string[] args);

而不是打电话

Execute<Bar>();

我需要使用Bar classe的限定名来调用泛型方法。 例如:

Type barType = Type.GetType("Program.Bar");
Execute<barType>();

我已经尝试过在其他线程上找到的一些答案,但所有这些答案都给了我一些问题。例如,我无法使用GetMethod(&#34; Execute&#34;),因为它会引发一个模糊的删除。

2 个答案:

答案 0 :(得分:0)

必须在编译时知道类型参数,因此为了直接调用该方法,您需要包装类型或更改签名以采用类型。

否则,您将需要使用反射来按名称调用方法。

答案 1 :(得分:0)

您可以像这样运行:

class A 
{
    public void Execute<T>() { }
    public void Execute(string[] args) { }
}

var method = typeof(A).GetMethods().FirstOrDefault(
    m => m.Name == "Execute" 
    && !m.GetParameters().Any()
    && m.GetGenericArguments().Count() == 1
    );

Type barType = Type.GetType("Program.Bar");

method.MakeGenericMethod(barType).Invoke();

您可以将FirstOrDefault更改为First,也可以在预期null时添加一些错误处理(取决于您的使用案例)。