为什么表达式构造函数隐藏在c#中

时间:2015-03-11 03:02:21

标签: c# linq

我目前正在寻找一种紧密结合的方式.Net创建表达式,我正在查看Expressions中的Linq类,我很困惑为什么他们这样做沿着Expression.Call(Params)的路线走过了new CallExpression(Params)

我的第一个猜测是可读性或他们隐藏了真正的类定义,使其更具未来弹性。

1 个答案:

答案 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的内部子类。

因此,静态方法根据给定的参数强制执行正确的逻辑以返回正确的类型。如果你能够直接调用构造函数,你就不会得到它。