考虑类似这样的类型
public interface IHaveGenericMethod
{
T1 Method<T1>(T1 parm);
T2 Method<T1,T2>(T1 parm);
int Method2(int parm);
}
如何为其方法获取methodInfo? 对于常规的非泛型方法,比如method2,我可以使用
typeof(IHaveGenericMethod).GetMethod("methodName",new Type[]{typeof(itsParameters)});
对于通用方法,我不能,因为它的参数不是本身的类型。 那么,我该怎么做? 我知道我可以打电话
typeof(IHaveGenericMethod).GetMethods()
获取该类型的所有方法,然后迭代该集合并进行一些匹配,但这很难看。还有更好的方法吗?
答案 0 :(得分:2)
请务必查看MSDN页面“Reflection and Generic Types”。
因为它的参数不是每个类型
实际上,我认为这是因为您要查询类型参数,但您可以提供给GetMethod()
的类型列表不适用于类型参数。
另外,请记住,选择泛型方法的“方法组”所需的只是知道泛型类型参数的数量。所以你可以算一下。
然后迭代
不要迭代,查询:
var mi = from mi in typeof(IHaveGenericMethod).GetMethods()
where mi.Name == "Method"
where mi.IsGenericMethodDefinition
where mi.GetGenericArguments().Length == 2
select mi;
答案 1 :(得分:1)
嗯,他们是类型 - 各种类型:
foreach (var method in typeof(IHaveGenericMethod).GetMethods())
{
Console.WriteLine(method.Name);
if (method.IsGenericMethodDefinition)
{
foreach (Type type in method.GetGenericArguments())
{
Console.WriteLine("> " + type.Name);
}
}
}
因此,您可以检查args的数量,并检查签名。但没有什么比这更清洁。
答案 2 :(得分:0)
我个人执行以下操作:
public static MethodInfo ExtractMethodInfo<TDeclaringType, TMethod>(Expression<Func<TDeclaringType, TMethod>> methodAccessExpression) {
return (MethodInfo)((ConstantExpression)((MethodCallExpression)((UnaryExpression)methodAccessExpression.Body).Operand).Object).Value;
}
var genericQueryMethodInfo = ExpressionHelper.ExtractMethodInfo<DbContext, Func<IQueryable<object>>>(context => context.Query<object>).GetGenericMethodDefinition();
这样,您一定会找到正确的方法,我认为这比遍历所有methodInfo更好。