<ImpliesType> 元素 (.NET Native)

如果该策略已应用到该包含类型或方法,将该策略应用到一个类型。

语法

<ImpliesType Name="type_name"
             Activate="policy_type"
             Browse="policy_type"
             Dynamic="policy_type"
             Serialize="policy_type"
             DataContractSerializer="policy_setting"
             DataContractJsonSerializer="policy_setting"
             XmlSerializer="policy_setting"
             MarshalObject="policy_setting"
             MarshalDelegate="policy_setting"
             MarshalStructure="policy_setting" />

特性和元素

下列各节描述了特性、子元素和父元素。

特性

属性 属性类型 说明
Name 常规 必需的特性。 指定类型名称。
Activate 反射 可选特性。 控制运行时对构造函数的访问,以启用实例激活。
Browse 反射 可选特性。 控制对有关程序元素信息的查询,但并不启用任何运行时访问。
Dynamic 反射 可选特性。 控制运行时对所有类型成员的访问,包括构造函数、方法、字段、属性和事件,以启用动态编程。
Serialize 序列化 可选特性。 控制运行时对构造函数、字段和属性的访问,使类型实例得到序列化和反序列化处理,这是通过库进行的,例如 Newtonsoft JSON 序列化程序。
DataContractSerializer 序列化 可选特性。 控制使用 System.Runtime.Serialization.DataContractSerializer 类的序列化策略。
DataContractJsonSerializer 序列化 可选特性。 控制使用 System.Runtime.Serialization.Json.DataContractJsonSerializer 类的 JSON 序列化策略。
XmlSerializer 序列化 可选特性。 控制使用 System.Xml.Serialization.XmlSerializer 类的 XML 序列化策略。
MarshalObject Interop 可选特性。 控制封送引用类型到 Windows 运行时和 COM 的策略。
MarshalDelegate Interop 可选特性。 控制将委托类型作为函数指针封送到本机代码的策略。
MarshalStructure Interop 可选特性。 控制封送处理值类型到本机代码的策略。

Name 特性

Value 说明
type_name 类型名称。 如果此 <ImpliesType> 元素代表的类型同其包含的 <Type> 元素位于相同的命名空间,type_name 可能会包括类型名称而不包括其命名空间。 否则,type_name 必须包含完全限定的类型名称。

所有其他特性

Value 说明
策略_设置 该设置将应用到这种策略类型。 可能值为 AllAutoExcludedPublicPublicAndInternalRequired PublicRequired PublicAndInternal 以及 Required All。 有关详细信息,请参阅运行时指令策略设置

子元素

无。

父元素

元素 说明
<类型> 将反射策略应用到一种类型及其所有成员。
<TypeInstantiation> 将反射策略应用到一种构造泛型类型及其所有成员。
<方法> 将反射策略应用到一个方法。

注解

<ImpliesType> 元素主要是供库使用的。 它讨论的是以下情景:

  • 如果一个例程需要反射到一个类型,它必然也要反射到另一种类型。

  • 否则,第二种类型的暗示的实例化元数据就不可用,因为静态分析没有指示这一步骤是必须的。

最常见的两种类型是附带共享类型参数的泛型实例化。

<ImpliesType> 元素的定义是以一个假设为基础的,即如果需要反射到父元素指定的类型上暗示着也需要反射到 <ImpliesType> 元素指定的类型上。 例如,以下反射指令应用到两种类型,Explicit<T>Implicit<T>

<Type Name="Explicit{ET}">
    <ImpliesType Name="Implicit{ET}" Dynamic="Required Public" />
</Type>

这个指令是不起作用的,除非 Explicit 的一个实例化具有一个已定义的 Dynamic 策略设置。 例如,如果对于 Explicit<Int32> 情况如此,Implicit<Int32> 会同其根公共成员一起被实例化,并且它们的元数据就能由动态编程访问。

以下是一个至少可以应用到序列化程序的实际实例。 这些指令捕获了这样一个需求,即对类型为 IList<something> 的对象进行反射,还涉及对相应的 List<something> 类型进行反射,而不需要对每个应用程序进行任何注释。

<Type Name="System.Collections.Generic.IList{T}">
   <ImpliesType Name="System.Collections.Generic.List{T}" Serialize="Public" />
</Type>

<ImpliesType> 元素也可能出现在 <Method> 元素内部,因为在某些情况下泛型方法暗示着反射到了一个类型实例化上。 例如,想象一个特定的库可以动态访问的泛型方法 IEnumerable<T> MakeEnumerable<T>(string spelling, T defaultValue) 以及相关的 List<T>Array 类型。 这可以表示为:

<Type Name="MyType">
    <Method Name="MakeEnumerable{T}" Signature="(System.String, T)" Dynamic="Included">
        <ImpliesType Name="T[]" Dynamic="Public" />
        <ImpliesType Name="System.Collections.Generic.List{T}" Dynamic="Public" />
    </Method>
</Type>

另请参阅