<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 屬性
值 | Description |
---|---|
type_name | 類型名稱。 如果這個 <Type> 元素是 <Namespace> 元素或另一個 <Type> 元素的子系,則 type_name 可以包含類型的名稱,而不含命名空間。 否則,type_name 必須包含完整的類型名稱。 |
所有其他屬性
值 | Description |
---|---|
policy_setting | 要套用到此原則類型的設定。 可能的值為 All 、Auto 、Excluded 、Public 、PublicAndInternal 、Required Public 、Required PublicAndInternal 和 Required All 。 如需詳細資訊,請參閱執行階段指示詞原則設定。 |
子元素
元素 | 描述 |
---|---|
<AttributeImplies> | 如果包含之類型是屬性,則定義屬性套用到的程式碼項目的執行階段原則。 |
<事件> | 將反映原則套用至屬於此類型的事件。 |
<欄位> | 將反映原則套用至屬於此類型的欄位。 |
<GenericParameter> | 將原則套用至泛型類型的參數類型。 |
<ImpliesType> | 如果原則已套用至包含 <Type> 元素所表示的類型,則會將該原則套用至類型。 |
<方法> | 將反映原則套用至屬於此類型的方法。 |
<MethodInstantiation> | 將反映原則套用至屬於此類型的建構泛型方法。 |
<屬性> | 將反映原則套用至屬於此類型的屬性。 |
<Subtypes> | 將執行階段原則套用至從包含類型繼承的所有類別。 |
<Type> |
將反映原則套用至巢狀類型。 |
<TypeInstantiation> | 將反映原則套用至建構的泛型類型。 |
父項目
元素 | Description |
---|---|
<應用程式> | 做為容器,以包含整個應用程式的類型,以及中繼資料可在執行階段用於反映的類型成員。 |
<組件> | 將反映原則套用至指定組件中的所有類型。 |
<程式庫> | 定義包含類型和類型成員的組件,這些類型和類型成員的中繼資料可在執行階段用於反映。 |
<Namespace> | 將反映原則套用至命名空間中的所有類型。 |
<Type> |
將反映原則套用至類型及其所有成員。 |
<TypeInstantiation> | 將反映原則套用至建構泛型類型及其所有成員。 |
備註
反映、序列化和 interop 屬性都是選用性。 如果都不存在,<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> 類別之欄位、屬性和方法的相關資訊。 變數 b
在範例中是 TextBlock 控制項。 因為範例只會擷取類型資訊,所以中繼資料的可用性是由 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 Native 工具鏈結,所以範例無法在執行階段顯示要求的成員資訊。 若要提供必要的中繼資料,將下列 <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[]) 方法擷取字串中的第七個字元的值,並顯示字串中的所有字元。 變數 b
在範例中是 TextBlock 控制項。
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 Native 工具鏈結編譯時,呼叫 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>