IArgumentProvider 接口

定义

提供用于访问多个树节点(DynamicExpression、ElementInit、MethodCallExpression、InvocationExpression、NewExpression 和 IndexExpression)的参数的内部接口。 此 API 仅供内部使用。

public interface class IArgumentProvider
public interface IArgumentProvider
type IArgumentProvider = interface
Public Interface IArgumentProvider
派生

注解

不应使用此 API。 它只是由于程序集重构而公开的,并且仅用于内部性能优化。 它支持两种优化来减小树的大小:

  1. 它使节点能够保留 而不是 IList<T>ReadOnlyCollection<T>。 这可以节省为每个节点分配只读集合的成本。

  2. 它允许创建保留特定数量的参数的专用子类, (例如 、Block2Block2Block4) 。 因此,这些节点避免分配 ReadOnlyCollection<T> 和 数组来存储其元素,从而为每个节点节省 32 个字节。 此方法由各种节点使用,包括 BlockExpressionInvocationExpressionMethodCallExpression

表达式树节点继续公开对象的原始 LINQ 属性 ReadOnlyCollection<T> 。 它们通过重用字段来存储数组或通常存储在数组中的元素来执行此操作。

对于数组情况,集合的类型为 而不是 IList<T>ReadOnlyCollection<T>。 最初构造节点时,它是一个数组。 此库中的编译器或实用工具通过此接口访问元素。 访问数组元素会将数组提升为 ReadOnlyCollection<T>

对于对象案例,第一个参数存储在类型为 Object的字段中。 最初构造节点时,此字段保存 Expression 第一个参数的 。 当此库中的编译器和实用程序访问参数时,它们将再次使用此接口,并且第一个参数的访问器使用内部 Expression.ReturnObject<T>(System.Object) 帮助程序方法返回处理 ExpressionReadOnlyCollection<T> 大小写的对象。 当用户访问 时,ReadOnlyCollection<T>对象字段将更新为直接保留 。ReadOnlyCollection<T>

属性必须 Expression 一致地返回相同的 ReadOnlyCollection<T>。 否则,表达式访问者使用的重写程序树演练程序将中断。 从 LINQ v1 返回的中断性变更与同Expression一节点不同ReadOnlyCollection<T>。 目前,用户可以依靠对象标识来判断节点是否已更改。 将 ReadOnlyCollection<T> 存储在重载字段中既可以减少内存使用量,又能保持公共 API 的兼容性。

属性

ArgumentCount

返回表达式树节点的参数数目。 此 API 仅供内部使用。

方法

GetArgument(Int32)

index 时返回自变量,当 index 超出界限时引发。 此 API 仅供内部使用。

适用于