<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 | 说明 |
---|---|
策略_设置 | 该设置将应用到这种策略类型。 可能值为 All 、Auto 、Excluded 、Public 、PublicAndInternal 、Required Public 、Required 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);
}
}
}
如以下代码所示,运行时指令文件为 Dynamic
到 Activate
显式设置了 BaseClass
和 Excluded
策略。 因此,类型 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;
}
}
}