GetMethod重载返回null

时间:2015-04-30 09:57:03

标签: c# .net generics reflection

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

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<T>搜索方法,如果没有找到,则会在非通用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) });
    ...

现在它有效。

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

1 个答案:

答案 0 :(得分:4)

  

GetMethod("CompareTo", new[] { typeof(IComparable<TProperty>), typeof(IComparable)})

     

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

不,它会查找带有签名CompareTo(IComparable<TProperty>, IComparable)的方法。

这也在Type.GetMethod() documentation

  

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