我想要一种面向 future 的方式来通过 Linq 表达式指定方法。
我正在设计一个允许用户指定方法的 API。例如,客户端代码可能如下所示:ApiClass<ClientClass>.DoSomething(c => c.ClientMethod)
.
我的 API 是强类型的。例如,
public void DoSomething(Expression<Func<TClientClass, Func<TParams, TResult>>> method){ ... }
我的问题:如何正确解析表达式树以获取客户端指定的 MethodInfo?
我一直在使用下面的代码,但似乎 .NET 4.5 的 4.5 版通过生成略有不同的表达式树来破坏它。我显然更愿意拥有适用于所有 future 版本的 C#/.NET 的东西
现有代码(类似于对 SO Extract method name from expression tree? 的回答):
private static MethodInfo GetMethodInfo(Expression method)
{
var lambda = method as LambdaExpression;
if (lambda == null) throw new ArgumentException("Argument is not a lambda expression (c => c.Thing)");
var convert = lambda.Body;
var body = (convert.NodeType == ExpressionType.Convert)
? ((UnaryExpression)convert).Operand as MethodCallExpression
: convert as MethodCallExpression;
if (body == null) throw new ArgumentException("Argument not in correct form (c => c.Thing)");
var methodInfoValue = body
.Arguments.OfType<ConstantExpression>()
.Where(exp => exp.Type == typeof(MethodInfo))
.Select(exp => (MethodInfo)exp.Value)
.FirstOrDefault();
if (methodInfoValue == null) throw new ArgumentException("Cannot find method name in expression.");
return methodInfoValue;
}
(此代码在 .NET 4.5.1 上失败:以 null methodInfoValue
结尾。)
最佳答案
一个可能的解决方案似乎是使用 ExpressionVisitor
遍历 Expression
并查找值为 的任何
,其 ConstantExpression
>MethodInfoMethodInfo.DeclaringType
属于正确的类......
这似乎适用于 .NET ≤ 4 和 .NET 4.5。
关于c# - 通过 Linq 表达式指定 MethodInfo 的面向 future 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23909101/