共用方式為


<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 要套用到此原則類型的設定。 可能的值為 AllAutoExcludedPublicPublicAndInternalRequired PublicRequired PublicAndInternalRequired 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>

另請參閱