我目前正在寻找一种紧密结合的方式.Net创建表达式,我正在查看Expressions
中的Linq
类,我很困惑为什么他们这样做沿着Expression.Call(Params)
的路线走过了new CallExpression(Params)
?
我的第一个猜测是可读性或他们隐藏了真正的类定义,使其更具未来弹性。
答案 0 :(得分:2)
如果您使用反编译器查看源代码,您会发现调用如下所示:
[__DynamicallyInvokable]
public static MethodCallExpression Call(Expression instance, MethodInfo method, IEnumerable<Expression> arguments)
{
ContractUtils.RequiresNotNull((object) method, "method");
ReadOnlyCollection<Expression> arguments1 = CollectionExtensions.ToReadOnly<Expression>(arguments);
Expression.ValidateMethodInfo(method);
Expression.ValidateStaticOrInstanceMethod(instance, method);
Expression.ValidateArgumentTypes((MethodBase) method, ExpressionType.Call, ref arguments1);
if (instance == null)
return (MethodCallExpression) new MethodCallExpressionN(method, (IList<Expression>) arguments1);
return (MethodCallExpression) new InstanceMethodCallExpressionN(method, instance, (IList<Expression>) arguments1);
}
您会注意到,即使通话类型为MethodCallExpression
,方法中的实际返回类型为MethodCallExpressionN
&amp; InstanceMethodCallExpressionN
。这两个是MethodCallExpression
的内部子类。
因此,静态方法根据给定的参数强制执行正确的逻辑以返回正确的类型。如果你能够直接调用构造函数,你就不会得到它。