<Subtypes> 要素 (.NET ネイティブ)

それを含む型から継承されたすべてのクラスに実行時ポリシーを適用します。

構文

<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 省略可能な属性です。 値型をネイティブ コードにマーシャリングするためのポリシーを制御します。

すべての属性

[値] 説明
policy_setting このポリシーの種類に適用する設定です。 指定できる値は、AllAutoExcludedPublicPublicAndInternalRequired PublicRequired PublicAndInternal、および Required All です。 詳細については、「ランタイム ディレクティブのポリシー設定」を参照してください。

子要素

なし。

親要素

要素 説明
<種類> 型とそのすべてのメンバーにリフレクション ポリシーを適用します。

解説

<Subtypes> 要素は、それを含む型のすべてのサブタイプにポリシーを適用します。 派生型および基底クラスに異なるポリシーを適用する場合に使用します。

リフレクション、シリアル化、および相互運用属性はいずれも省略可能ですが、そのうち少なくとも 1 つが存在する必要があります。

次の例では、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 ポリシーと 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;
        }
    }
}

こちらもご覧ください