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


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

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

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

Атрибуты

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

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

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

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

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

Комментарии

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

<TypeInstantiation> Если элемент является дочерним элементом <элемента Assembly>, <Namespace> или <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>

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