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


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

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

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

Атрибуты

Атрибут Тип атрибута Description
Name Общие Обязательный атрибут элемента . Указывает имя типа.
Arguments Общие Обязательный атрибут элемента . Задает аргументы универсального типа. При наличии нескольких аргументов, они разделяются запятыми.
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 Имя типа. Если этот <TypeInstantiation> элемент является дочерним элементом пространства имен>, элементом <<Type> или другим <TypeInstantiation> элементом, type_name может указать имя типа без его пространства имен. В противном случае атрибут type_name должен содержать полное имя типа. Имя типа не является внутренним. Например, для объекта System.Collections.Generic.List<T> элемент <TypeInstantiation> может выглядеть следующим образом:

\<TypeInstantiation Name=System.Collections.Generic.List Dynamic="Required Public" />

Атрибут аргументов

значение Описание
type_argument Задает аргументы универсального типа. При наличии нескольких аргументов, они разделяются запятыми. Каждый аргумент должен содержать полное имя типа.

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

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

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

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

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

Элемент Description
<Приложение> Служит в качестве контейнера для типов и членов типов приложения, метаданные которого доступны для отражения во время выполнения.
<Сборка> Применяет политику отражения ко всем типам в указанной сборке.
<Библиотека> Определяет сборку, содержащую типы и члены типов, метаданные которой доступны для отражения во время выполнения.
<Пространство имен> Применяет политику отражения ко всем типам в пространстве имен.
<Тип> Применяет политику отражения к типу и всем его членам.
<TypeInstantiation> Применяет политику отражения к сконструированному универсальному типу и всем его членам.

Замечания

Атрибуты отражения, сериализации и взаимодействия являются необязательными. Тем не менее, по крайней мере один должен присутствовать.

<TypeInstantiation> Если элемент является дочерним элементом <сборки>, <пространства> имен или <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 в примере возникает исключение MissingMetadataException в строке, вызывающей Type.GetGenericTypeDefinition метод. Чтобы избежать исключений и предоставить необходимые метаданные, добавьте следующий элемент <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>

См. также