<Elemento Type> (.NET Native)

Aplica la directiva de tiempo de ejecución a un tipo determinado, como una clase o estructura.

Sintaxis

<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" />

Atributos y elementos

En las siguientes secciones se describen los atributos, los elementos secundarios y los elementos primarios.

Atributos

Atributo Tipo de atributo Descripción
Name General Atributo necesario. Especifica el nombre de tipo.
Activate Reflexión Atributo opcional. Controla el acceso en tiempo de ejecución a los constructores para permitir la activación de instancias.
Browse Reflexión Atributo opcional. Controla la consulta para obtener información sobre los elementos de programa, pero no permite el acceso en tiempo de ejecución.
Dynamic Reflexión Atributo opcional. Controla el acceso en tiempo de ejecución a todos los miembros de tipo (incluidos constructores, métodos, campos, propiedades y eventos) para permitir la programación dinámica.
Serialize Serialización Atributo opcional. Controla el acceso en tiempo de ejecución a constructores, campos y propiedades para permitir que bibliotecas como el serializador JSON Newtonsoft puedan serializar y deserializar instancias de tipo.
DataContractSerializer Serialización Atributo opcional. Controla la directiva de serialización que usa la clase System.Runtime.Serialization.DataContractSerializer.
DataContractJsonSerializer Serialización Atributo opcional. Controla la directiva de serialización JSON que usa la clase System.Runtime.Serialization.Json.DataContractJsonSerializer.
XmlSerializer Serialización Atributo opcional. Controla la directiva de serialización XML que usa la clase System.Xml.Serialization.XmlSerializer.
MarshalObject Interop Atributo opcional. Controla la directiva de serialización de tipos de referencia a Windows Runtime y COM.
MarshalDelegate Interop Atributo opcional. Controla la directiva de serialización de tipos de delegado como punteros de función a código nativo.
MarshalStructure Interop Atributo opcional. Controla la directiva de cálculo de referencias de tipos de valor a código nativo.

Name (atributo)

Valor Descripción
type_name Nombre del tipo. Si este <Type> elemento es el elemento secundario de un <elemento Namespace> u otro <Type> elemento, type_name puede incluir el nombre del tipo sin su espacio de nombres. De lo contrario, type_name debe incluir el nombre de tipo completo.

Resto de atributos

Valor Descripción
policy_setting Configuración que se va a aplicar a este tipo de directiva. Los valores posibles son All, Auto, Excluded, Public, PublicAndInternal, Required Public, Required PublicAndInternal y Required All. Para obtener más información, vea Runtime Directive Policy Settings (Configuración de directiva de la directiva en tiempo de ejecución).

Elementos secundarios

Elemento Descripción
<AttributeImplies> Si el tipo contenedor es un atributo, define la directiva de tiempo de ejecución para elementos de código a los que se aplica el atributo.
<Evento> Aplica la directiva de reflexión a un evento perteneciente a este tipo.
<Campo> Aplica la directiva de reflexión a un campo de este tipo.
<GenericParameter> Aplica la directiva al tipo del parámetro de tipo genérico.
<ImpliesType> Aplica la directiva a un tipo, en caso de que dicha directiva se haya aplicado al tipo representado por el elemento <Type> que lo contiene.
<Método> Aplica la directiva de reflexión a un método perteneciente a este tipo.
<MethodInstantiation> Aplica la directiva de reflexión a un método genérico construido perteneciente a este tipo.
<Propiedad> Aplica la directiva de reflexión a una propiedad de este tipo.
<Subtipos> Aplica la directiva en tiempo de ejecución a todas las clases heredadas del tipo contenedor.
<Type> Aplica la directiva de reflexión a un tipo anidado.
<TypeInstantiation> Aplica la directiva de reflexión a un tipo genérico construido.

Elementos primarios

Elemento Descripción
<Application> Sirve de contenedor de los tipos y miembros de tipo de la aplicación cuyos metadatos están disponibles para la reflexión en tiempo de ejecución.
<Ensamblado> Aplica la directiva de reflexión a todos los tipos en un ensamblado especificado.
<Biblioteca> Define el ensamblado que contiene los tipos y miembros de tipo cuyos metadatos están disponibles para la reflexión en tiempo de ejecución.
<Nombres> Aplica la directiva de reflexión a todos los tipos en un espacio de nombres.
<Type> Aplica la directiva de reflexión a un tipo y a todos sus miembros.
<TypeInstantiation> Aplica la directiva de reflexión a un tipo genérico construido y a todos sus miembros.

Comentarios

La reflexión, la serialización y los atributos de interoperabilidad son opcionales. Si ninguno de ellos está presente, el elemento <Type> actúa como un contenedor cuyos tipos secundarios definen directivas para los miembros individuales.

Si un <Type> elemento es el elemento secundario de un <elemento Assembly>, <Namespace>, <Type>o <TypeInstantiation> , invalida la configuración de directiva definida por el elemento primario.

Un elemento <Type> de un tipo genérico aplica su directiva a todas las instancias que no tienen su propia directiva. La directiva de tipos genéricos construidos se define mediante el <elemento TypeInstantiation> .

Si el tipo es un tipo genérico, su nombre se decora con un símbolo de énfasis grave (') seguido de su número de parámetros genéricos. Por ejemplo, el atributo Name de un elemento <Type> de la clase System.Collections.Generic.List<T> aparece como Name="System.Collections.Generic.List`1".

Ejemplo 1

En el ejemplo siguiente se utiliza la reflexión para mostrar información sobre los campos, las propiedades y los métodos de la clase System.Collections.Generic.List<T>. La variable b del ejemplo es un TextBlock control . Dado que el ejemplo simplemente recupera información de tipos, la disponibilidad de los metadatos se controla mediante la configuración de directiva 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;
}

Dado que los metadatos de la List<T> clase no se incluyen automáticamente en la cadena de herramientas de .NET Native, el ejemplo no muestra la información de miembro solicitada en tiempo de ejecución. Para proporcionar los metadatos necesarios, agregue el elemento <Type> siguiente al archivo de directivas en tiempo de ejecución. Tenga en cuenta que, dado que hemos proporcionado un elemento namespace> primario<, no es necesario proporcionar un nombre de tipo completo en el <Type> elemento.

<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>

Ejemplo 2

En el ejemplo siguiente se utiliza la reflexión para recuperar un objeto PropertyInfo que representa a la propiedad String.Chars[]. A continuación, se utiliza el método PropertyInfo.GetValue(Object, Object[]) para recuperar el valor del séptimo carácter de una cadena y para mostrar todos los caracteres de la cadena. La variable b del ejemplo es un TextBlock control .

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

Dado que los metadatos del String objeto no están disponibles, la llamada al PropertyInfo.GetValue(Object, Object[]) método produce una NullReferenceException excepción en tiempo de ejecución cuando se compila con la cadena de herramientas .NET Native. Para eliminar la excepción y proporcionar los metadatos necesarios, agregue el siguiente elemento <Type> al archivo de directivas en tiempo de ejecución:

<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>

Vea también