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



我目前正在考虑构建一些紧跟.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的内部子类。

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

最新更新