CustomReflectionContext Classe
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
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
- Derivado
Exemplos
O exemplo seguinte demonstra como fazer uma subclasse CustomReflectionContext para adicionar um atributo personalizado a todos os membros de um dado tipo cujos nomes começam por "To". Para executar este código, cole-o num projeto de consola vazio e certifica-te de incluir 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();
}
}
Observações
CustomReflectionContext fornece uma forma de adicionar ou remover atributos personalizados de objetos de reflexão, ou adicionar propriedades fictícias a esses objetos, sem ter de reimplementar o modelo completo de reflexão. O padrão CustomReflectionContext simplesmente envolve objetos de reflexão sem fazer quaisquer alterações, mas ao subclassar e sobrescrever os métodos relevantes, 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 o seu código segue a convenção de aplicar um determinado atributo a métodos de fábrica, mas agora é obrigado a trabalhar com código de terceiros que não possui atributos. Pode usar CustomReflectionContext para especificar uma regra para identificar os objetos que devem ter atributos e fornecer esses atributos aos objetos quando são visualizados no seu código.
Para o usar CustomReflectionContext eficazmente, o código que utiliza os objetos refletidos deve suportar a 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 em tempo de execução. Muitos métodos de reflexão no .NET Framework fornecem um ReflectionContext parâmetro para este propósito.
Para modificar os atributos que são aplicados a um parâmetro ou membro de reflexão, substitua o método GetCustomAttributes(ParameterInfo, IEnumerable<Object>) ou o método GetCustomAttributes(MemberInfo, IEnumerable<Object>). Estes métodos consideram o objeto alvo e a lista de atributos dentro do seu contexto atual de reflexão, e retornam a lista de atributos que devem ter no contexto de reflexão personalizado.
Warning
CustomReflectionContext Os métodos não devem aceder diretamente à lista de atributos de um objeto ou método refletido chamando o método GetCustomAttributes na instância fornecida MemberInfo ou ParameterInfo, mas devem usar declaredAttributes lista, que é passada como parâmetro às sobrecargas do método GetCustomAttributes.
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 devolve uma lista de propriedades adicionais. Deve-se usar o método CreateProperty para criar objetos de propriedade para devolver. Pode especificar delegados ao criar a propriedade que servirá como acessório de propriedade, e pode omitir um dos acessórios para criar uma propriedade apenas de leitura ou apenas escrita. Note-se que tais propriedades fictícias não têm metadados nem suporte de Common Intermediate Language (CIL).
Warning
Tenha cuidado com a igualdade entre objetos refletidos quando trabalhar com contextos de reflexão, porque os objetos podem representar o mesmo objeto refletido em múltiplos contextos. Pode usar o MapType método para obter a versão de um determinado contexto de reflexão de um objeto refletido.
Warning
Um objeto CustomReflectionContext altera os atributos devolvidos por um determinado objeto de reflexão, como os obtidos pelo método GetCustomAttributes. Não altera os dados de atributos personalizados devolvidos pelo GetCustomAttributesData método, e estas duas listas não coincidem quando se usa um contexto de reflexão personalizado.
Construtores
| Name | Description |
|---|---|
| CustomReflectionContext() |
Inicializa uma nova instância da CustomReflectionContext classe. |
| CustomReflectionContext(ReflectionContext) |
Inicializa uma nova instância da CustomReflectionContext classe com o contexto de reflexão especificado como base. |
Métodos
| Name | Description |
|---|---|
| AddProperties(Type) |
Quando sobrescrito numa classe derivada, fornece um conjunto de propriedades adicionais para o tipo especificado, conforme representado neste contexto de reflexão. |
| 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, para ser usada com o AddProperties(Type) método e usando os atributos personalizados especificados. |
| CreateProperty(Type, String, Func<Object,Object>, Action<Object,Object>) |
Cria um objeto que representa uma propriedade a ser adicionada a um tipo, para ser usada com o AddProperties(Type) método. |
| Equals(Object) |
Determina se o objeto especificado é igual ao objeto atual. (Herdado de Object) |
| GetCustomAttributes(MemberInfo, IEnumerable<Object>) |
Quando sobrescrito numa classe derivada, fornece uma lista de atributos personalizados para o membro especificado, conforme representado neste contexto de reflexão. |
| GetCustomAttributes(ParameterInfo, IEnumerable<Object>) |
Quando sobrescrito numa classe derivada, fornece uma lista de atributos personalizados para o parâmetro especificado, conforme representado neste contexto de reflexão. |
| GetHashCode() |
Serve como função de hash predefinida. (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 neste contexto de reflexão. (Herdado de ReflectionContext) |
| MapAssembly(Assembly) |
Obtém-se a representação, neste contexto de reflexão, de uma montagem que é representada 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 a partir de outro contexto de reflexão. |
| MemberwiseClone() |
Cria uma cópia superficial do atual Object. (Herdado de Object) |
| ToString() |
Devolve uma cadeia que representa o objeto atual. (Herdado de Object) |