我目前正在考虑构建一些紧跟.Net创建表达式的方式的东西,我正在Linq
中查看Expressions
类,我很困惑为什么他们会在new CallExpression(Params)
之类的东西上走Expression.Call(Params)
的路线?
我的第一个猜测是可读性,或者他们向你隐藏了真实的类定义,使其更具未来弹性。
如果你使用反编译器查看源代码,你会发现调用看起来像这样:
[__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
& InstanceMethodCallExpressionN
。两者是MethodCallExpression
的内部子类。
因此,静态方法根据给定的参数强制执行正确的逻辑以返回正确的类型。如果您能够直接调用构造函数,则不会得到它。