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


<Элемент 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 Сериализация Необязательный атрибут. Определяет политику для сериализации 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. Дополнительные сведения см. в разделе Параметры политики директив среды выполнения.

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

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

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

Элемент Описание
<Приложение> Служит в качестве контейнера для типов и членов типов приложения, метаданные которого доступны для отражения во время выполнения.
<Сборка> Применяет политику отражения ко всем типам в указанной сборке.
<Библиотека> Определяет сборку, содержащую типы и члены типов, метаданные которой доступны для отражения во время выполнения.
<Пространства имен> Применяет политику отражения ко всем типам в пространстве имен.
<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> в файл директивы среды выполнения. Обратите внимание, что, так как мы предоставили родительский <элемент 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 для объекта недоступны, вызов 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>

См. также раздел