Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用具有类的限定名称的字符串调用泛型不明确方法_C#_.net_Generics_Reflection_.net 4.5.2 - Fatal编程技术网

C# 使用具有类的限定名称的字符串调用泛型不明确方法

C# 使用具有类的限定名称的字符串调用泛型不明确方法,c#,.net,generics,reflection,.net-4.5.2,C#,.net,Generics,Reflection,.net 4.5.2,假设我有一个第三方类Foo,签名如下: void Execute<T>(); void Execute(string[] args); class A { public void Execute<T>() { } public void Execute(string[] args) { } } var method = typeof(A).GetMethods().FirstOrDefault( m => m.Name == "Exec

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

void Execute<T>();
void Execute(string[] args);
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();
void Execute();
void Execute(字符串[]args);
而不是打电话

Execute<Bar>();
Execute();
我需要使用Bar类的限定名称来调用泛型方法。 例如:

Type barType = Type.GetType("Program.Bar");
Execute<barType>();
Type barType=Type.GetType(“Program.Bar”);
执行();

我已经尝试了在其他线程上找到的一些答案,但它们都给了我问题。例如,我不能使用GetMethod(“Execute”),因为它抛出了一个不明确的expetion。

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


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

您可以这样运行它:

void Execute<T>();
void Execute(string[] args);
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();
A类
{
public void Execute(){}
public void Execute(字符串[]args){}
}
var method=typeof(A).GetMethods().FirstOrDefault(
m=>m.Name==“执行”
&&!m.GetParameters().Any()
&&m.GetGenericArguments().Count()==1
);
Type barType=Type.GetType(“Program.Bar”);
方法。MakeGenericMethod(barType.Invoke();

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

听起来您希望基于
类型动态调用泛型方法。如果是这样,请看这个问题:有没有理由不使用
Type.GetMethod(string,Type[])
而不是枚举所有方法?@YuvalItzchakov-Yep-因为我们想找到一个只有一个泛型参数的方法(例如,如果存在
void Execute(){}
重载)