【问题标题】:GetMethod overload returns nullGetMethod 重载返回 null
【发布时间】:2015-04-30 18:01:31
【问题描述】:

我想从特定接口获取方法,但它可以在多个接口中。我写了这段代码:

private static Expression<Func<T, T, int>> CreateCompareTo<TProperty>(MemberExpression expression, Expression<Func<T, T, int>> result) where TProperty : IComparable<TProperty>, IComparable
{
    var methodInfo = typeof(TProperty).GetMethod("CompareTo", new[] { typeof(IComparable<TProperty>), typeof(IComparable) });
    ...

MSDN

一个 Type 对象数组,表示数量、顺序和类型 要获取的方法的参数。

所以我希望它会通过IComparable&lt;T&gt; 搜索方法,如果没有找到,将在非通用IComparable 中搜索它。但事实并非如此。好吧,现在我重写它:

private static Expression<Func<T, T, int>> CreateCompareTo<TProperty>(MemberExpression expression, Expression<Func<T, T, int>> result) where TProperty : IComparable<TProperty>, IComparable
{
    Type t = typeof(TProperty);
    var methodInfo = t.GetMethod("CompareTo", new[] { typeof(IComparable<TProperty>) }) ?? t.GetMethod("CompareTo", new[] { typeof(IComparable) });
    ...

现在它可以工作了。

为什么第一个选项不起作用?

【问题讨论】:

    标签: c# .net generics reflection


    【解决方案1】:

    GetMethod("CompareTo", new[] { typeof(IComparable&lt;TProperty&gt;), typeof(IComparable)})

    所以我希望它会通过 IComparable 搜索方法,如果没有找到,将在非泛型 IComparable 中搜索它

    不,它会寻找带有签名CompareTo(IComparable&lt;TProperty&gt;, IComparable) 的方法。

    这也在Type.GetMethod() documentation:

    搜索指定的公共方法其参数与指定的参数类型匹配

    【讨论】:

    猜你喜欢
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    相关资源
    最近更新 更多