3

考虑这样的类型

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()

获取该类型的所有方法,然后遍历该集合并进行一些匹配,但这很丑陋。有没有更好的办法?

4

3 回答 3

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;
于 2009-01-13T04:10:46.413 回答
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);
            }
        }
    }

所以你可以检查参数的数量,并检查签名。但没有什么更清洁的。

于 2009-01-11T22:06:29.940 回答
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();

这样,你一定能找到正确的,而且我认为这比遍历所有方法信息要好。

于 2019-05-20T13:10:08.943 回答