<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 | 要為建構的泛型類型套用至此原則類型的設定。 可能的值為 All 、Auto 、Excluded 、Public 、PublicAndInternal 、Required Public 、Required PublicAndInternal 和 Required 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>