有没有一种很好的方法来获得开放泛型方法的MethodInfo?

时间:2009-01-11 21:53:22

标签: .net reflection metaprogramming

考虑类似这样的类型

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

获取该类型的所有方法,然后迭代该集合并进行一些匹配,但这很难看。还有更好的方法吗?

3 个答案:

答案 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更好。