C# 使用具有类的限定名称的字符串调用泛型不明确方法
假设我有一个第三方类Foo,签名如下: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
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(){}
重载)