共用方式為


<TypeInstantiation> 元素 (.NET Native)

將執行階段反映原則套用至建構的泛型類型。

語法

<TypeInstantiation Name="type_name"
                   Arguments="type_arguments"
                   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 一般 必要的 屬性。 指定類型名稱。
Arguments 一般 必要的 屬性。 指定泛型型別引數。 如果有多個引數存在,會以逗號分隔。
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 屬性

Description
type_name 類型名稱。 如果這個 <TypeInstantiation> 元素是 <Namespace> 元素、<Type> 元素或另一個 <TypeInstantiation> 元素的子元素,type_name 就可以指定類型的名稱,而不包含其命名空間。 否則,type_name 必須包含完整的類型名稱。 不裝飾類型名稱。 例如,針對 System.Collections.Generic.List<T> 物件,<TypeInstantiation> 元素可能會像下面這樣:

\<TypeInstantiation Name=System.Collections.Generic.List Dynamic="Required Public" />

引數屬性

Description
type_argument 指定泛型型別引數。 如果有多個引數存在,會以逗號分隔。 每個引數都必須包含完整的類型名稱。

所有其他屬性

Description
policy_setting 要為建構的泛型類型套用至此原則類型的設定。 可能的值為 AllAutoExcludedPublicPublicAndInternalRequired PublicRequired PublicAndInternalRequired All。 如需詳細資訊,請參閱執行階段指示詞原則設定

子元素

元素 描述
<事件> 將反映原則套用至屬於此類型的事件。
<欄位> 將反映原則套用至屬於此類型的欄位。
<ImpliesType> 如果原則已套用至包含 <TypeInstantiation> 元素所表示的類型,則會將該原則套用至類型。
<方法> 將反映原則套用至屬於此類型的方法。
<MethodInstantiation> 將反映原則套用至屬於此類型的建構泛型方法。
<屬性> 將反映原則套用至屬於此類型的屬性。
<類型> 將反映原則套用至巢狀類型。
<TypeInstantiation> 將反映原則套用至巢狀建構的泛型類型。

父項目

元素 Description
<應用程式> 做為容器,以包含整個應用程式的類型,以及中繼資料可在執行階段用於反映的類型成員。
<組件> 將反映原則套用至指定組件中的所有類型。
<程式庫> 定義包含類型和類型成員的組件,這些類型和類型成員的中繼資料可在執行階段用於反映。
<Namespace> 將反映原則套用至命名空間中的所有類型。
<類型> 將反映原則套用至類型及其所有成員。
<TypeInstantiation> 將反映原則套用至建構泛型類型及其所有成員。

備註

反映、序列化和 interop 屬性都是選用性。 不過,必須至少有一個屬性存在。

如果 <TypeInstantiation> 元素是 <Assembly><Namespace><Type> 元素的子元素,則會覆寫父元素所定義的原則設定。 如果 <Type> 元素定義相對應的泛型型別定義,則 <TypeInstantiation> 元素只會針對指定建構泛型型別的具現化,覆寫執行階段反映原則。

範例

下列範例會使用反映,從建構的 Dictionary<TKey,TValue> 物件擷取泛型類型定義。 它也會使用反映來顯示代表建構泛型類型和泛型類型定義的 Type 物件。 變數 b 在範例中是 TextBlock 控制項。

   public static void GetGenericInfo()
   {
      // Get the type that represents the generic type definition and
      // display information about it.
      Type generic1 = typeof(Dictionary<,>);
      DisplayGenericType(generic1);

      // Get the type that represents a constructed generic type and its
      // generic type definition.
      Dictionary<string, Example> d1 = new Dictionary<string, Example>();
      Type constructed1 = d1.GetType();
      Type generic2 = constructed1.GetGenericTypeDefinition();

      // Display information for the generic type definition, and
      // for the constructed type Dictionary<String, Example>.
      DisplayGenericType(constructed1);
      DisplayGenericType(generic2);

      // Construct an array of type arguments.
      Type[] typeArgs = { typeof(string), typeof(Example) };
      // Construct the type Dictionary<String, Example>.
      Type constructed2 = generic1.MakeGenericType(typeArgs);

      DisplayGenericType(constructed2);

      object o = Activator.CreateInstance(constructed2);

      b.Text += "\r\nCompare types obtained by different methods:\n";
      b.Text += String.Format("   Are the constructed types equal? {0}\n",
                              (d1.GetType() == constructed2));
      b.Text += String.Format("   Are the generic definitions equal? {0}\n",
                              (generic1 == constructed2.GetGenericTypeDefinition()));

      // Demonstrate the DisplayGenericType and
      // DisplayGenericParameter methods with the Test class
      // defined above. This shows base, interface, and special
      // constraints.
      DisplayGenericType(typeof(TestGeneric<>));
   }

   // Display information about a generic type.
   private static void DisplayGenericType(Type t)
   {
      b.Text += String.Format("\n{0}\n", t);
      b.Text += String.Format("   Generic type? {0}\n",
                              t.GetTypeInfo().GenericTypeParameters.Length !=
                              t.GenericTypeArguments.Length);
      b.Text += String.Format("   Generic type definition? {0}\n",
                              ! t.IsConstructedGenericType);

      // Get the generic type parameters.
      Type[] typeParameters = t.GetTypeInfo().GenericTypeParameters;
      if (typeParameters.Length > 0)
      {
         b.Text += String.Format("   {0} type parameters:\n",
                                 typeParameters.Length);
         foreach (Type tParam in typeParameters)
            b.Text += String.Format("      Type parameter: {0} position {1}\n",
                     tParam.Name, tParam.GenericParameterPosition);
      }
      else
      {
         Type[] typeArgs = t.GenericTypeArguments;
         b.Text += String.Format("   {0} type arguments:\n",
                                 typeArgs.Length);
         foreach (var tArg in typeArgs)
               b.Text += String.Format("      Type argument: {0}\n",
                                       tArg);
      }
      b.Text += "\n-------------------------------\n";
   }
}

public interface ITestInterface { }

public class TestBase { }

public class TestGeneric<T> where T : TestBase, ITestInterface, new() { }

public class TestArgument : TestBase, ITestInterface
{
   public TestArgument()
   { }
}

使用 .NET Native 工具鏈編譯之後,此範例會在呼叫Type.GetGenericTypeDefinition方法的程式列上擲回 MissingMetadataException 例外狀況。 若要消除此例外狀況,並提供必要的中繼資料,您可以將下列 <TypeInstantiation> 元素加入至執行階段指示詞檔案:

<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
  <Application>
    <Assembly Name="*Application*" Dynamic="Required All" />
     <TypeInstantiation Name="System.Collections.Generic.Dictionary"
                        Arguments="System.String,GenericType.Example"
                        Dynamic="Required Public" />
  </Application>
</Directives>

另請參閱