Partilhar via


CustomReflectionContext Classe

Definição

Representa um contexto de reflexão personalizável.

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
Herança
CustomReflectionContext
Derivado

Exemplos

O exemplo a seguir demonstra como adicionar CustomReflectionContext um atributo personalizado a todos os membros de um determinado tipo cujos nomes começam com "To". Para executar esse código, cole-o em um projeto de console vazio e inclua uma referência 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();
    }
}

Comentários

CustomReflectionContext fornece uma maneira de adicionar ou remover atributos personalizados de objetos de reflexão ou adicionar propriedades fictícias a esses objetos, sem implementar novamente o modelo de reflexão completo. O padrão CustomReflectionContext simplesmente encapsula objetos de reflexão sem fazer nenhuma alteração, mas ao subclasse e substituindo os métodos relevantes, você pode adicionar, remover ou alterar os atributos que se aplicam a qualquer parâmetro ou membro refletido ou adicionar novas propriedades a um tipo refletido.

Por exemplo, suponha que seu código siga a convenção de aplicação de um atributo específico aos métodos de fábrica, mas agora você precisa trabalhar com código de terceiros que não tem atributos. Você pode usar CustomReflectionContext para especificar uma regra para identificar os objetos que devem ter atributos e fornecer os objetos com esses atributos quando eles forem exibidos do seu código.

Para usar CustomReflectionContext efetivamente, o código que usa os objetos refletidos deve dar suporte à noção de especificar um contexto de reflexão, em vez de assumir que todos os objetos refletidos estão associados ao contexto de reflexão de runtime. Muitos métodos de reflexão no .NET Framework fornecem um ReflectionContext parâmetro para essa finalidade.

Para modificar os atributos que são aplicados a um parâmetro ou membro refletido, substitua o GetCustomAttributes(ParameterInfo, IEnumerable<Object>) método ou GetCustomAttributes(MemberInfo, IEnumerable<Object>) . Esses métodos pegam o objeto refletido e a lista de atributos em seu contexto de reflexão atual e retornam a lista de atributos que ele deve ter no contexto de reflexão personalizado.

Aviso

CustomReflectionContext os métodos não devem acessar a lista de atributos de um objeto ou método refletido diretamente chamando o GetCustomAttributes método na instância fornecida MemberInfo ou ParameterInfo , em vez disso, devem usar a declaredAttributes lista, que é passada como um parâmetro para as sobrecargas de GetCustomAttributes método.

Para adicionar propriedades a um tipo refletido, substitua o AddProperties método . O método aceita um parâmetro que especifica o tipo refletido e retorna uma lista de propriedades adicionais. Você deve usar o CreateProperty método para criar objetos de propriedade a serem retornados. Você pode especificar delegados ao criar a propriedade que servirá como o acessador de propriedade e pode omitir um dos acessadores para criar uma propriedade somente leitura ou somente gravação. Observe que essas propriedades fictícias não têm nenhum suporte a metadados ou CIL (Common Intermediate Language).

Aviso

Tenha cuidado com a igualdade entre objetos refletidos quando você trabalha com contextos de reflexão, pois os objetos podem representar o mesmo objeto refletido em vários contextos. Você pode usar o MapType método para obter uma versão específica do contexto de reflexão de um objeto refletido.

Aviso

Um CustomReflectionContext objeto altera os atributos retornados por um objeto de reflexão específico, como aqueles obtidos pelo GetCustomAttributes método . Ele não altera os dados de atributo personalizado retornados pelo GetCustomAttributesData método e essas duas listas não corresponderão quando você usar um contexto de reflexão personalizado.

Construtores

CustomReflectionContext()

Inicializa uma nova instância da classe CustomReflectionContext.

CustomReflectionContext(ReflectionContext)

Inicializa uma nova instância da classe CustomReflectionContext com o contexto de reflexão especificado como uma base.

Métodos

AddProperties(Type)

Quando substituído em uma classe derivada, fornece uma coleção de propriedades adicionais para o tipo especificado, conforme representado neste contexto de reflexão.

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

Cria um objeto que representa uma propriedade a ser adicionada a um tipo, a ser usado com o método AddProperties(Type).

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

Cria um objeto que representa uma propriedade a ser adicionada a um tipo, a ser usado com o método AddProperties(Type) e usando os atributos personalizados especificados.

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

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

Quando substituído em uma classe derivada, fornece uma lista de atributos personalizados para o membro especificado, conforme representado neste contexto de reflexão.

GetCustomAttributes(ParameterInfo, IEnumerable<Object>)

Quando substituído em uma classe derivada, fornece uma lista de atributos personalizados para o parâmetro especificado, conforme representado neste contexto de reflexão.

GetHashCode()

Serve como a função de hash padrão.

(Herdado de Object)
GetType()

Obtém o Type da instância atual.

(Herdado de Object)
GetTypeForObject(Object)

Obtém a representação do tipo do objeto especificado nesse contexto de reflexão.

(Herdado de ReflectionContext)
MapAssembly(Assembly)

Obtém a representação, neste contexto de reflexão, de um assembly representado por um objeto de outro contexto de reflexão.

MapType(TypeInfo)

Obtém a representação, neste contexto de reflexão, de um tipo representado por um objeto de outro contexto de reflexão.

MemberwiseClone()

Cria uma cópia superficial do Object atual.

(Herdado de Object)
ToString()

Retorna uma cadeia de caracteres que representa o objeto atual.

(Herdado de Object)

Aplica-se a