【问题标题】:Is there a good way of getting MethodInfo of open generic method?有没有获取开放泛型方法的 MethodInfo 的好方法?
【发布时间】:2010-09-30 19:59:38
【问题描述】:

考虑这样的类型

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

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

【问题讨论】:

  • re “但这并不能回答我的问题” - 也许,但请参阅“但没有什么更干净”。 - 即 AFAIK,你真的不能比这更干净了。

标签: .net reflection metaprogramming


【解决方案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);
            }
        }
    }

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

【讨论】:

  • 嗯,是的,但这并不能回答我的问题
  • (回复了原始问题,因此它出现在您的列表中......)
【解决方案2】:

请务必查看 MSDN 页面“Reflection and Generic Types”。

因为它的参数本身不是类型

其实我想是因为你要查询type参数,但是你可以提供给GetMethod()的类型列表不是类型参数的。

另外,请记住,选择泛型方法的“方法组”只需知道泛型类型参数的数量。所以你可以数一数。

然后迭代

不要迭代,查询:

       var mi = from mi in typeof(IHaveGenericMethod).GetMethods()
                where mi.Name == "Method"
                where mi.IsGenericMethodDefinition
                where mi.GetGenericArguments().Length == 2
                select mi;

【讨论】:

  • 这是偷偷摸摸的,但它仍然可以返回多个方法。它还需要 LINQ,ergo .NET 3.5,这是我想要避免的。我能想到的唯一改进是 typeof(IHaveGenericMethod).GetMethods() 使用 typeof(IHaveGenericMethod).GetMembers(lots,of,arguments)
【解决方案3】:

我个人会做以下事情:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多