<Subtypes> 元素 (.NET Native)

将运行时策略应用到从包含类型继承的所有类。

语法

<Subtypes 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" />

特性和元素

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

特性

属性 属性类型 说明
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 可选特性。 控制封送处理值类型到本机代码的策略。

所有特性

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

子元素

无。

父元素

元素 说明
<类型> 将反射策略应用到一种类型及其所有成员。

注解

<Subtypes> 元素将策略应用到其包含类型的所有子类型。 当你想将不同的策略应用到派生类型及其基类时可使用它。

反射、序列化和互操作特性都是可选项,但必须存在至少一项。

示例

以下实例定义了一个名为 BaseClass 的类和一个名为 Derived1 的子类。

namespace Examples.Libraries
{
   public class BaseClass
   {
      public BaseClass()
      { }

      public override string ToString()
      {
          return String.Format("{0} Version  {1}", this.GetType().Name, Version);
      }
      public virtual double Version
      { get { return 1.0; }}
    }

   public class Derived1 : BaseClass
   {
      public Derived1() : base()
      {}

      public override double Version
      { get { return 1.1; }}

      public override string ToString()
      {
         return String.Format("{0} Version {1}", this.GetType().Name, Version);
      }
   }
}

如以下代码所示,运行时指令文件为 DynamicActivate 显式设置了 BaseClassExcluded 策略。 因此,类型 BaseClass 的对象无法得到动态实例化或通过调用 BaseClass 类构造函数得到实例化。 然而,<Subtypes> 元素允许从 BaseClass 派生的类得到动态实例化并通过对其类构造函数的调用得到实例化。

<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
  <Application>
   <Assembly Name="*Application*" Dynamic="Required All" />
     <Type Name="Examples.Libraries.BaseClass" Activate ="Excluded" Dynamic="Excluded" >
        <Subtypes Activate="Public" Dynamic ="Public"/>
     </Type>
  </Application>
</Directives>

由于 <Subtypes> 指令的存在,以下代码通过成功调用 Derived1 方法执行动态实例化了一个 Activator.CreateInstance(Type) 实例。 此处的块变量是空白 UWP 应用中的 TextBlock 对象。

namespace Examples
{
   using System.Reflection;
   using Examples.Libraries;

   public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();

            Derived1 d1 = new Derived1();
            block.Text += d1.ToString() + Environment.NewLine;

            Type derivedType = typeof(Derived1);
            Object obj = Activator.CreateInstance(derivedType);
            block.Text += obj.GetType().FullName + Environment.NewLine;
        }
    }
}

另请参阅