Поделиться через


<Элемент 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" />

Атрибуты и элементы

В следующих разделах описаны атрибуты, дочерние и родительские элементы.

Атрибуты

Атрибут Тип атрибута Description
Name Общие Обязательный атрибут элемента . Указывает имя типа.
Activate Отражение Необязательный атрибут элемента . Управляет доступом среды выполнения к конструкторам для включения активации экземпляров.
Browse Отражение Необязательный атрибут элемента . Управляет запросами для получения сведений об элементах программы, но не включает доступ среды выполнения.
Dynamic Отражение Необязательный атрибут элемента . Управляет доступом среды выполнения ко всем членам типа, включая конструкторы, методы, поля, свойства и события, чтобы включить динамическое программирование.
Serialize Сериализация Необязательный атрибут элемента . Управляет доступом среды выполнения к конструкторам, полям и свойствам, позволяющим сериализовать и десериализовать экземпляры типа с помощью таких библиотек, как, например, сериализатор Newtonsoft JSON.
DataContractSerializer Сериализация Необязательный атрибут элемента . Определяет политику для сериализации, в которой используется класс System.Runtime.Serialization.DataContractSerializer.
DataContractJsonSerializer Сериализация Необязательный атрибут элемента . Определяет политику для сериализации JSON, в которой используется класс System.Runtime.Serialization.Json.DataContractJsonSerializer.
XmlSerializer Сериализация Необязательный атрибут элемента . Определяет политику для сериализации XML, в которой используется класс System.Xml.Serialization.XmlSerializer.
MarshalObject Interop Необязательный атрибут элемента . Определяет политику для маршалинга ссылочных типов в среды выполнения Windows и COM.
MarshalDelegate Interop Необязательный атрибут элемента . Определяет политики для маршалинга типов делегатов как указателей функции на машинный код.
MarshalStructure Interop Необязательный атрибут элемента . Определяет политики для маршалинга типов значений в машинный код.

Name - атрибут

значение Описание
type_name Имя типа. Если этот <Type> элемент является дочерним элементом элемента пространства> имен или другим <Type> элементом<, type_name может включать имя типа без его пространства имен. В противном случае атрибут type_name должен содержать полное имя типа.

Все остальные атрибуты

значение Описание
policy_setting Параметр, применяемый для этого типа политики. Допустимые значения All, Auto, Excluded, Public, PublicAndInternal, Required Public, Required PublicAndInternal и Required All. Дополнительные сведения см. в разделе Параметры политики директив среды выполнения.

Дочерние элементы

Элемент Description
<AttributeImplies> Если содержащий тип является атрибутом, определяет политику выполнения для элементов кода, к которым применяется этот атрибут.
<Событие> Применяет политику отражения события, относящегося к этому типу.
<Поле> Применяет политику отражения поля, относящегося к этому типу.
<GenericParameter> Применяет политику к типу параметра универсального типа.
<ImpliesType> Применяет политику к типу, если политика была применена для типа, представленного содержащим элементом <Type>.
<Method> Применяет политику отражения метода, относящегося к этому типу.
<MethodInstantiation> Применяет политику отражения к сконструированному универсальному методу, относящемуся к этому типу.
<Свойство> Применяет политику отражения к свойству, относящемуся к этому типу.
<Подтипов> Применяет политику среды выполнения для всех классов, унаследованных из содержащего типа.
<Type> Применяет политику отражения к вложенному типу.
<TypeInstantiation> Применяет политику отражения к сконструированному универсальному типу.

Родительские элементы

Элемент Description
<Приложение> Служит в качестве контейнера для типов и членов типов приложения, метаданные которого доступны для отражения во время выполнения.
<Сборка> Применяет политику отражения ко всем типам в указанной сборке.
<Библиотека> Определяет сборку, содержащую типы и члены типов, метаданные которой доступны для отражения во время выполнения.
<Пространство имен> Применяет политику отражения ко всем типам в пространстве имен.
<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>. Переменная 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> в файл директивы среды выполнения. Обратите внимание, что, так как мы предоставили родительский <элемент пространства> имен, нам не нужно указать полное имя типа в элементе<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 объекта недоступны, вызов PropertyInfo.GetValue(Object, Object[]) метода вызывает NullReferenceException исключение во время выполнения при компиляции с цепочкой инструментов .NET Native. Чтобы избежать исключений и предоставить необходимые метаданные, добавьте следующий элемент <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>

См. также