<Type> 要素 (.NET Native)

クラスや構造体などの特定の型に実行時ポリシーを適用します。

構文

<Type 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 属性

[値] 説明
type_name 型名。 この <Type> 要素が <Namespace> 要素または別の <Type> 要素の子である場合、type_name には名前空間なしで型の名前を含めることができます。 それ以外の場合は、type_name には完全修飾型名を含める必要があります。

その他すべての属性

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

子要素

要素 説明
<AttributeImplies> 含んでいる型が属性の場合は、その属性が適用されるコード要素の実行時ポリシーを定義します。
<イベント> この型に属するイベントにリフレクション ポリシーを適用します。
<フィールド> この型に属するフィールドにリフレクション ポリシーを適用します。
<GenericParameter> ジェネリック型のパラメーターの型にポリシーを適用します。
<ImpliesType> 型にポリシーを適用します (それを含む <Type> 要素により表される型にそのポリシーが適用されている場合)。
<メソッド> この型に属するメソッドにリフレクション ポリシーを適用します。
<MethodInstantiation> この型に属する構築されたジェネリック メソッドにリフレクション ポリシーを適用します。
<プロパティ> この型に属するプロパティにリフレクション ポリシーを適用します。
<Subtypes> それを含む型から継承されたすべてのクラスに実行時ポリシーを適用します。
<Type> 入れ子になった型にリフレクション ポリシーを適用します。
<TypeInstantiation> 構築されたジェネリック型にリフレクション ポリシーを適用します。

親要素

要素 説明
<Application> 実行時にリフレクションで使用可能なメタデータを持つ、アプリケーション全体の型と型のメンバーのコンテナーとして機能します。
<アセンブリ> 指定したアセンブリ内のすべての型にリフレクション ポリシーを適用します。
<ライブラリ> 実行時にリフレクションに使用可能なメタデータを持つ型と型のメンバーを含むアセンブリを定義します。
<名前空間> 名前空間内のすべての型にリフレクション ポリシーを適用します。
<Type> 型とそのすべてのメンバーにリフレクション ポリシーを適用します。
<TypeInstantiation> 構築されたジェネリック型とそのすべてのメンバーにリフレクション ポリシーを適用します。

解説

リフレクション、シリアル化、および相互運用属性はすべて省略可能です。 いずれも存在しない場合、<Type> 要素は、その子型が個々のメンバーのポリシーを定義するコンテナーとして機能します。

<Type> 要素が <Assembly> 要素、<Namespace> 要素、<Type> 要素、または <TypeInstantiation> 要素の子である場合、親要素によって定義されたポリシー設定をオーバーライドします。

ジェネリック型の <Type> 要素は、独自のポリシーを持たないすべてのインスタンス化にそのポリシーを適用します。 構築されたジェネリック型のポリシーは、<TypeInstantiation> 要素により定義されます。

型がジェネリック型の場合、アクサン グラーブ記号 (`) の後ろにジェネリック パラメーターの数を付けたもので名前が修飾されます。 たとえば、Name クラスの <Type> 要素の System.Collections.Generic.List<T> 属性は、Name="System.Collections.Generic.List`1" と示されます。

例 1

次の例では、リフレクションを使用して、System.Collections.Generic.List<T> クラスのフィールド、プロパティ、およびメソッドに関する情報を表示します。 例の変数 bTextBlock コントロールです。 この例は単に型情報を取得するのみであるため、メタデータの可用性は Browse ポリシー設定により制御されます。

public static void GetReflectionInfo()
{
   Type t = typeof(List<>);
   b.Text += String.Format("Type information for {0}\n", t);

   // Get fields.
   b.Text += "\nFields:\n";

   var fields = t.GetTypeInfo().DeclaredFields;
   int nFields = 0;
   foreach (var field in fields)
   {
      b.Text += String.Format("   {0} ({1})", field.Name, field.FieldType.Name);
      nFields++;
   }
   if (nFields == 0) b.Text += "   None\n";

   // Get properties.
   b.Text += "\nProperties:\n";
   var props = t.GetTypeInfo().DeclaredProperties;
   int nProps = 0;
   foreach (var prop in props)
   {
      b.Text += String.Format("   {0} ({1})\n", prop.Name, prop.PropertyType.Name);
      nProps++;
   }
   if (nProps == 0) b.Text += "   None\n";

   // Get methods.
   b.Text += "\nMethods:\n";
   var methods = t.GetTypeInfo().DeclaredMethods;
   int nMethods = 0;
   foreach (var method in methods)
   {
      if (method.IsSpecialName) continue;
      b.Text += String.Format("   {0}({1}) ({2})\n", method.Name,
                              GetSignature(method), method.ReturnType.Name);
      nMethods++;
   }
   if (nMethods == 0) b.Text += "   None\n";
}

private static string GetSignature(MethodInfo m)
{
   string signature = null;
   var parameters = m.GetParameters();
   for (int ctr = 0; ctr < parameters.Length; ctr++)
   {
      signature += String.Format("{0} {1}", parameters[ctr].ParameterType.Name,
                                  parameters[ctr].Name);
      if (ctr < parameters.Length - 1) signature += ", ";
   }
   return signature;
}

List<T> クラスのメタデータは .NET ネイティブ ツール チェーンにより自動的に含められないため、例では実行時に要求されたメンバー情報を表示できません。 必要なメタデータを提供するには、次の <Type> 要素をランタイム ディレクティブ ファイルに追加します。 親要素 <Namespace> を指定しているため、<Type> 要素で完全修飾型名を指定する必要はないことに注意してください。

<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
   <Application>
      <Assembly Name="*Application*" Dynamic="Required All" />
      <Namespace Name ="System.Collections.Generic" >
        <Type Name="List`1" Browse="Required All" />
     </Namespace>
   </Application>
</Directives>

例 2

次の例では、リフレクションを使用して、PropertyInfo プロパティを表す String.Chars[] オブジェクトを取得します。 続けて、PropertyInfo.GetValue(Object, Object[]) メソッドを使用して文字列の 7 番目の文字の値を取得し、文字列のすべての文字を表示します。 例の変数 bTextBlock コントロールです。

public void Example()
{
  string test = "abcdefghijklmnopqrstuvwxyz";

  // Get a PropertyInfo object.
  TypeInfo ti = typeof(string).GetTypeInfo();
  PropertyInfo pinfo = ti.GetDeclaredProperty("Chars");

  // Show the seventh letter ('g')
  object[] indexArgs = { 6 };
  object value = pinfo.GetValue(test, indexArgs);
  b.Text += String.Format("Character at position {0}: {1}\n", indexArgs[0], value);

  // Show the complete string.
  b.Text += "\nThe complete string:\n";
  for (int x = 0; x < test.Length; x++)
  {
      b.Text += pinfo.GetValue(test, new Object[] {x}).ToString() + " ";
  }
}
// The example displays the following output:
//       Character at position 6: g
//
//       The complete string:
//       a b c d e f g h i j k l m n o p q r s t u v w x y z

String オブジェクトのメタデータは使用できないため、.NET ネイティブ ツール チェーンでコンパイルした場合、実行時に PropertyInfo.GetValue(Object, Object[]) メソッドを呼び出すと NullReferenceException 例外がスローされます。 例外を排除し、必要なメタデータを提供するには、次の <Type> 要素をランタイム ディレクティブ ファイルに追加します。

<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
  <Application>
    <Assembly Name="*Application*" Dynamic="Required All" />
    <Type Name="System.String" Dynamic="Required Public"/> -->
  </Application>
</Directives>

関連項目