Comparteix a través de


CustomReflectionContext Clase

Definición

Representa un contexto de reflexión personalizable.

public ref class CustomReflectionContext abstract : System::Reflection::ReflectionContext
public abstract class CustomReflectionContext : System.Reflection.ReflectionContext
type CustomReflectionContext = class
    inherit ReflectionContext
Public MustInherit Class CustomReflectionContext
Inherits ReflectionContext
Herencia
CustomReflectionContext
Derivado

Ejemplos

En el ejemplo siguiente se muestra cómo agregar una subclase CustomReflectionContext para agregar un atributo personalizado a todos los miembros de un tipo determinado cuyos nombres comienzan por "To". Para ejecutar este código, péguelo en un proyecto de consola vacío y asegúrese de incluir una referencia a System.Reflection.Context.dll.

//A blank example attribute.
class myAttribute : Attribute
{
}

//Reflection context with custom rules.
class myCRC : CustomReflectionContext
{
    //Called whenever the reflection context checks for custom attributes.
           protected override IEnumerable<object> GetCustomAttributes(MemberInfo member, IEnumerable<object> declaredAttributes)
           {
               //Add example attribute to "To*" members.
               if (member.Name.StartsWith("To")) {
                   yield return new myAttribute();
               }
               //Keep existing attributes as well.
               foreach (var attr in declaredAttributes) yield return attr;
         }
}

class Program
{
    static void Main(string[] args)
    {
        myCRC mc = new myCRC();
        Type t = typeof(String);

        //A representation of the type in the default reflection context.
        TypeInfo ti = t.GetTypeInfo();

        //A representation of the type in the customized reflection context.
        TypeInfo myTI = mc.MapType(ti);

        //Display all the members of the type and their attributes.
        foreach (MemberInfo m in myTI.DeclaredMembers)
        {
           Console.WriteLine(m.Name + ":");
           foreach (Attribute cd in m.GetCustomAttributes())
           {
                Console.WriteLine(cd.GetType());
           }
        }

        Console.WriteLine();

        //The "ToString" member as represented in the default reflection context.
        MemberInfo mi1 = ti.GetDeclaredMethods("ToString").FirstOrDefault();

        //All the attributes of "ToString" in the default reflection context.
        Console.WriteLine("'ToString' Attributes in Default Reflection Context:");
        foreach (Attribute cd in mi1.GetCustomAttributes())
        {
            Console.WriteLine(cd.GetType());
        }

        Console.WriteLine();

        //The same member in the custom reflection context.
        mi1 = myTI.GetDeclaredMethods("ToString").FirstOrDefault();

        //All its attributes, for comparison.  myAttribute is now included.
        Console.WriteLine("'ToString' Attributes in Custom Reflection Context:");
        foreach (Attribute cd in mi1.GetCustomAttributes())
        {
            Console.WriteLine(cd.GetType());
        }

        Console.ReadLine();
    }
}

Comentarios

CustomReflectionContext proporciona una manera de agregar o quitar atributos personalizados de objetos de reflexión, o agregar propiedades ficticas a esos objetos, sin volver a implementar el modelo de reflexión completo. El valor predeterminado CustomReflectionContext simplemente ajusta los objetos de reflexión sin realizar ningún cambio, pero mediante la subclase y invalidación de los métodos pertinentes, puede agregar, quitar o cambiar los atributos que se aplican a cualquier parámetro o miembro reflejado, o agregar nuevas propiedades a un tipo reflejado.

Por ejemplo, supongamos que el código sigue la convención de aplicar un atributo determinado a los métodos de fábrica, pero ahora es necesario trabajar con código de terceros que carece de atributos. Puede usar CustomReflectionContext para especificar una regla para identificar los objetos que deben tener atributos y proporcionar los objetos con esos atributos cuando se ven desde el código.

Para usar CustomReflectionContext de forma eficaz, el código que usa los objetos reflejados debe admitir la noción de especificar un contexto de reflexión, en lugar de asumir que todos los objetos reflejados están asociados al contexto de reflexión en tiempo de ejecución. Muchos métodos de reflexión de .NET Framework proporcionan un ReflectionContext parámetro para este propósito.

Para modificar los atributos que se aplican a un parámetro o miembro reflejados, invalide el GetCustomAttributes(ParameterInfo, IEnumerable<Object>) método o GetCustomAttributes(MemberInfo, IEnumerable<Object>) . Estos métodos toman el objeto reflejado y la lista de atributos en su contexto de reflexión actual y devuelven la lista de atributos que debe tener en el contexto de reflexión personalizado.

Advertencia

CustomReflectionContextLos métodos no deben tener acceso a la lista de atributos de un objeto o método reflejado directamente llamando al GetCustomAttributes método en la instancia o ParameterInfo proporcionadaMemberInfo, sino que deben usar la declaredAttributes lista, que se pasa como parámetro a las sobrecargas del GetCustomAttributes método.

Para agregar propiedades a un tipo reflejado, invalide el AddProperties método . El método acepta un parámetro que especifica el tipo reflejado y devuelve una lista de propiedades adicionales. Debe usar el CreateProperty método para crear objetos de propiedad que se van a devolver. Puede especificar delegados al crear la propiedad que servirá como descriptor de acceso de propiedad y puede omitir uno de los descriptores de acceso para crear una propiedad de solo lectura o de solo escritura. Tenga en cuenta que estas propiedades ficticas no tienen metadatos ni respaldo de lenguaje intermedio común (CIL).

Advertencia

Tenga cuidado con la igualdad entre los objetos reflejados al trabajar con contextos de reflexión, ya que los objetos pueden representar el mismo objeto reflejado en varios contextos. Puede usar el MapType método para obtener una versión determinada del contexto de reflexión de un objeto reflejado.

Advertencia

Un CustomReflectionContext objeto modifica los atributos devueltos por un objeto de reflexión determinado, como los obtenidos por el GetCustomAttributes método . No modifica los datos de atributo personalizados devueltos por el GetCustomAttributesData método y estas dos listas no coincidirán cuando se usa un contexto de reflexión personalizado.

Constructores

CustomReflectionContext()

Inicializa una nueva instancia de la clase CustomReflectionContext.

CustomReflectionContext(ReflectionContext)

Inicializa una nueva instancia de la clase CustomReflectionContext con el contexto de reflexión especificado como base.

Métodos

AddProperties(Type)

Cuando se reemplaza en una clase derivada, proporciona una colección de propiedades adicionales para el tipo especificado, como se representa en este contexto de reflexión.

CreateProperty(Type, String, Func<Object,Object>, Action<Object,Object>)

Crea un objeto que representa una propiedad que se va a agregar a un tipo y que se va a utilizar con el método AddProperties(Type).

CreateProperty(Type, String, Func<Object,Object>, Action<Object,Object>, IEnumerable<Attribute>, IEnumerable<Attribute>, IEnumerable<Attribute>)

Crea un objeto que representa una propiedad que se va a agregar a un tipo y que se va a utilizar con el método AddProperties(Type) usando los atributos personalizados especificados.

Equals(Object)

Determina si el objeto especificado es igual que el objeto actual.

(Heredado de Object)
GetCustomAttributes(MemberInfo, IEnumerable<Object>)

Cuando se reemplaza en una clase derivada, proporciona una lista de atributos personalizados para el miembro especificado, como se representa en este contexto de reflexión.

GetCustomAttributes(ParameterInfo, IEnumerable<Object>)

Cuando se reemplaza en una clase derivada, proporciona una lista de atributos personalizados para el parámetro especificado, como se representa en este contexto de reflexión.

GetHashCode()

Sirve como la función hash predeterminada.

(Heredado de Object)
GetType()

Obtiene el Type de la instancia actual.

(Heredado de Object)
GetTypeForObject(Object)

Obtiene la representación del tipo del objeto especificado en este contexto de reflexión.

(Heredado de ReflectionContext)
MapAssembly(Assembly)

Obtiene la representación, en este contexto de reflexión, de un ensamblado representado por un objeto de otro contexto de reflexión.

MapType(TypeInfo)

Obtiene la representación, en este contexto de reflexión, de un tipo representado por un objeto de otro contexto de reflexión.

MemberwiseClone()

Crea una copia superficial del Object actual.

(Heredado de Object)
ToString()

Devuelve una cadena que representa el objeto actual.

(Heredado de Object)

Se aplica a