我想知道是否有人可以演示如何使用Type的GetMethod()方法为以下签名检索MethodInfo对象:
Class.StaticMethod<T>(T arg1, IInterface1 arg2, IEnumerable<IInterface2> arg3)
谢谢,
XAM
答案 0 :(得分:7)
MethodInfo methodInfo = typeof(Class)
.GetMethods(
BindingFlags.Public | BindingFlags.Static
)
.Where(m => m.Name == "StaticMethod")
.Where(m => m.IsGenericMethod)
.Where(m => m.GetGenericArguments().Length == 1)
.Where(m => m.GetParameters().Length == 3)
.Where(m =>
m.GetParameters()[0].ParameterType ==
m.GetGenericArguments()[0] &&
m.GetParameters()[1].ParameterType ==
typeof(IInterface1) &&
m.GetParameters()[2].ParameterType ==
typeof(IEnumerable<IInterface2>)
)
.Single();
请注意,您必须按照
进行操作methodInfo = methodInfo.MakeGenericMethod(new Type[] { typeof(ConcreteType) });
关闭ConcreteType
类型参数T
所需类型的类型。
我假设:
class Class {
public static void StaticMethod<T>(
T arg1,
IInterface1 arg2,
IEnumerable<IInterface2> arg3
) { }
}
答案 1 :(得分:0)
Type[] types = new Type[]{typeof(ClassUsedForTypeArgument)};
var info = typeof(Class).getMethod("StaticMethod").MakeGenericMethod(types);
如果我没有弄错的话,“info”包含你想要的东西。
编辑:如果您只想要通用方法信息,而不使用type参数进行实例化,则可以执行以下操作。
var info = typeof(Class).getMethod("StaticMethod");