0

我是 Reflection 的新手,我正在尝试下面的代码

var queryableLastMethodInfo = typeof(Queryable).GetMethod("Last", new Type[]{ typeof(IQueryable<>) });

queryableLastMethodInfo总是返回null

能否请你帮忙?

4

3 回答 3

3

这应该为您提供不带谓词的“Last”扩展方法的 MethodInfo:

var queryableLastMethodInfo = typeof(Queryable).GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
    .FirstOrDefault(x => x.Name == "Last" && x.GetParameters().Count() == 1);

...这应该给你另一个:

var queryableLastMethodInfo = typeof(Queryable).GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
    .FirstOrDefault(x => x.Name == "Last" && x.GetParameters().Count() == 2);
于 2016-12-26T18:38:49.207 回答
1

您可以找到所有Last方法并选择只有一个参数的方法:

var method = typeof (Queryable).GetMethods()
                               .Where(m => m.Name == "Last")
                               .First(m => m.GetParameters().Length == 1);

这个问题和答案中描述了一般情况。

于 2016-12-26T18:37:21.897 回答
0

如果 Queryable 接收到名为“Last”的新方法并且只采用一个参数,则不要冒险代码失败。

准确永远不会太多。

var queryableLastMethodInfo = typeof(Queryable).GetMethods().Single(_Method => _Method.Name == "Last" && _Method.IsGenericMethod && _Method.GetGenericArguments().Length == 1 && _Method.GetParameters().Length == 1   && _Method.GetParameters().Single().ParameterType == typeof(IQueryable<>).MakeGenericType(_Method.GetGenericArguments().Single()));
于 2016-12-26T18:58:05.117 回答