Visão geral do descritor de tipos

O TypeDescriptor arquitetura aprimora os recursos de.NET reflexão.

Arquitetura do descritor de tipo

O TypeDescriptor arquitetura baseia-se no mecanismo central reflexão e adiciona regras adicionais e recursos. Por exemplo, o TypeDescriptor classe oferece suporte a propriedades de extensão de mesclagem de uma IContainer, e também suporta filtragem propriedades e eventos por meio de um IDesigner.

Além disso, o TypeDescriptor a arquitetura possibilita vários recursos. A tabela a seguir mostra os recursos da arquitetura.

Recurso

Descrição

Substituição de instância

Permite que um tipo arbitrário a ser criado quando outro tipo é solicitado.

Substituição de metadados

Permite que os metadados do objeto a ser modificado.

Redirecionamento de atributo

Permite que os atributos seja especificado dinamicamente.

Substituição de destino e o sombreamento

Permite que um objeto para substituir o outro.

Suporte do descritor de tipo estendido

Permite o acesso às propriedades do objeto adicionado por outros objetos.

Para oferecer suporte a esses recursos, o TypeDescriptor classe está totalmente integrada com os vários recursos do.Modelo de componente NET Framework. Ele é compatível com objetos COM, provedores de extender, designers e propriedades do CLR.

Dica

Você pode usar o TypeDescriptor arquitetura em seu código de tempo de execução, bem como seu código de tempo de design.

Para dar suporte à extensibilidade, a TypeDescriptor classe tem uma classe complementar chamada TypeDescriptionProvider e um atributo complementar chamado TypeDescriptionProviderAttribute. Você pode usar um TypeDescriptionProviderAttribute em uma classe para introduzir uma forma completamente diferente de expor os metadados que atenda às suas metas de design.

Classe TypeDescriptionProvider

O TypeDescriptionProvider classe pode ser considerada como um plug-in para o TypeDescriptor classe. Para uma determinada instância de TypeDescriptor, pode haver várias classes de provedor de descrição do tipo, todos os metadados de oferta para o TypeDescriptor.

Atributo TypeDescriptionProvider

O TypeDescriptionProviderAttribute é um atributo que você pode colocar em uma classe. Este atributo é usado para indicar que o tipo tem um provedor de descrição do tipo personalizado associado a ele. Por sua vez, o atributo fornece uma maneira, por meio de metadados, para instalar um provedor de descrição do tipo. Quando esse tipo é passado para qualquer API do TypeDescriptor classe, TypeDescriptor detecta esse atributo, cria uma instância do provedor de descrição do tipo descrito dentro dele e conecta o provedor nas tabelas de internas do TypeDescriptor. Após fazer isso, TypeDescriptor continuará processando a API. O processamento permite que um tipo instalar um provedor de descrição do tipo personalizado automaticamente sob demanda.

Recursos do descritor de tipo

O TypeDescriptor a arquitetura possibilita recursos além daquelas fornecidas pelo.Reflexão do NET Framework.

Substituição de instância

Substituição de instância ocorre quando você deseja criar um tipo, mas o tipo que seja realmente criado é diferente da que foi solicitada. Substituição de instância é realizada quando você substitui todas as chamadas para new com chamadas para o CreateInstance método. Esse método procura tabelas internas dentro de TypeDescriptor para um TypeDescriptionProvider o objeto que está associado com o tipo de dados fornecidos. Se ele encontrar um, ele delega a chamada para esse objeto.

Substituição de metadados

Substituição de metadados ocorre quando você quiser modificar os metadados disponíveis para um ou mais objetos. Uma aplicação comum da substituição de metadados é na implementação de designers. Substituição de metadados pode ser realizada com provedores de descrição do tipo, que podem ser adicionados e removidos usando os seguintes métodos na TypeDescriptor:

Redirecionamento de atributo

Há alguns casos na.Modelo de objeto do NET Framework onde o tipo de uma propriedade propositadamente é feito para ser não-específica. Por exemplo, o DataSource propriedade no DataGridView classe é digitada como object. Esta estrutura permite que a fonte de dados para aceitar vários tipos de entrada, mas não fornece nenhum lugar comum para adicionar metadados para descrever as características da propriedade. Cada propriedade de fonte de dados em todo o.NET Framework precisa ter idênticos metadados para conversores de tipo e editores de tipo de interface (UI) do usuário.

O AttributeProviderAttribute classe resolve essa situação. Quando esse atributo é colocado em uma propriedade, as regras mudarão para obtenção de atributos para o descritor de propriedade Attributes coleção. Em geral, o descritor de propriedade reúne os atributos locais e mescla com atributos do tipo de propriedade. Quando o AttributeProviderAttribute atributo é aplicado, os atributos são tirados do tipo retornado por AttributeProviderAttribute, não o tipo de propriedade real. O AttributeProviderAttribute é usado em fontes de dados de ponto da fonte de dados específico para IListSource, e os metadados apropriados é colocado no IListSource para permitir a ligação de dados. Esse redirecionamento permite que os elementos externos como, por exemplo, Visual Studio para facilmente adicionar metadados a todas as fontes de dados.

Obtido a partir de um tipo de atributos declarados na AttributeProviderAttribute têm uma prioridade entre os atributos de tipo da propriedade e os atributos na propriedade. O conjunto completo de atributos disponíveis é a fusão, em ordem de prioridade, como mostrado na seguinte lista:

  1. Atributos de propriedade

  2. Atributos do provedor de atributo

  3. Atributos de tipo de propriedade

Substituição de destino e o sombreamento

Substituição de destino ocorre quando um objeto significa outro. Uma aplicação comum da substituição de destino está na implementação de designers.

No.Arquitetura de designer do NET Framework, um componente pode ter um designer associado a ele. Esse designer pode implementar IDesignerFilter e fornecer suas próprias propriedades. Essas propriedades serão mescladas com a propriedade definida para o componente ao qual o designer está associado. Essas propriedades podem ser novas para o componente. Elas também podem ter o mesmo nome e tipo como propriedades já definidas no componente. Quando a nova propriedade compartilha o nome e tipo como uma propriedade existente, ele é chamado de sombreamento, porque o designer oculta, ou as sombras, a propriedade existente no componente. A ilustração a seguir mostra o efeito de sombra de uma propriedade.

Sombreando a propriedade Text

Aqui, o componente oferece duas propriedades e o designer também oferece duas propriedades. O Text propriedade é oferecida no designer e o componente e está sendo sombreada. O resultado final de uma chamada para GetProperties é de três propriedades. Existe uma no componente e os outros dois existirem no designer.

Essa propriedade de filtragem é realizada através do uso de ITypeDescriptorFilterService, que implementa a superfície de design. TypeDescriptorrecursos são necessários quando chegou a hora para definir um valor na propriedade. O código para definir um valor de Grid propriedade ficaria assim:

    gridProp.SetValue(component, value);

As informações de tipo real sobre a propriedade ele aponta para uma instância do designer, não o componente. Se foi feita uma chamada de reflexão para realmente definir a propriedade, a chamada aumentaria uma exceção de invocação de destino porque a ocorrência do componente não corresponde ao tipo de designer.

O TypeDescriptor classe tem lógica inerente para contornar esta situação. Quando é feita uma chamada de propriedade, o TypeDescriptor verifica se o tipo de membro é uma instância do objeto passado de classe. Em caso afirmativo, ele permite a chamada prossiga. Caso contrário, a classe tenta localizar o criador do objeto e se o designer pode ser encontrado e for do tipo correto, a classe substitui a ocorrência do componente com a instância do designer.

Os seguintes métodos na TypeDescriptor suporte a substituição de destino:

Suporte do descritor de tipo estendido

O GetExtendedTypeDescriptor método retorna um descritor de tipo personalizado estendido para o objeto fornecido. Um descritor de tipo estendido é um descritor de tipo personalizado que oferece propriedades que outros objetos adicionou a este objeto, mas na verdade não são definidos no objeto. Por exemplo, na.Modelo de componente NET Framework, os objetos que implementam o IExtenderProvider interface pode associar propriedades a outros objetos que residem na mesma IContainer. O GetTypeDescriptor método não retorna um descritor de tipo que fornece essas propriedades estendidas extra, mas GetExtendedTypeDescriptor retorna o conjunto dessas propriedades estendidas. O TypeDescriptor classe automaticamente mescla os resultados dessas coleções de propriedade de dois.

Dica

Embora o.Modelo de componente NET Framework só oferece suporte a propriedades estendidas, GetExtendedTypeDescriptor pode ser usado para atributos estendidos e eventos da mesma forma, se o provedor de descrição do tipo oferece suporte a ele.

Consulte também

Referência

TypeDescriptor

TypeDescriptionProvider

TypeDescriptionProviderAttribute

ICustomTypeDescriptor

CustomTypeDescriptor

IContainer

IDesigner

Outros recursos

Estendendo o suporte para tempo de design