Compartilhar via


Visão geral do descritor de tipo

O TypeDescriptor arquitetura aprimora os recursos de.NET reflection.

Arquitetura do descritor de tipo

O TypeDescriptor arquitetura baseia-se no mecanismo de reflexão de núcleo 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 arquitetura permite que 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 é solicitado a outro tipo.

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 de espera 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 é totalmente integrado 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.

ObservaçãoObservação

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

Para oferecer suporte a 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 de 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 de 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 em tabelas internas de TypeDescriptor. Após fazer isso, TypeDescriptor continua processando 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 arquitetura habilita recursos além daquelas fornecidas pelo.NET Framework reflexo.

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 objeto que está associado com o tipo de dados fornecidos. Se ele encontrar um, ele delega a chamada para o 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 os provedores de descrição de 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 é intencionalmente 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 de alterar para a obtenção de atributos para o descritor de propriedade Attributes coleção. Normalmente, o descritor de propriedade reúne os atributos locais e as mescla com atributos de tipo de propriedade. Quando o AttributeProviderAttribute atributo é aplicado, os atributos são obtidos para o tipo retornado por AttributeProviderAttribute, não do 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 habilitar a vinculação de dados. Esse redirecionamento permite que os parceiros 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 no AttributeProviderAttribute têm uma prioridade entre os atributos de tipo da propriedade e os atributos da 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 é três propriedades. Existir no componente e os outros dois existem no designer.

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

    gridProp.SetValue(component, value);

As informações sobre a propriedade de tipo real 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 instância de componente não corresponde ao tipo de designer.

O TypeDescriptor classe possui 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 que a chamada prossiga. Caso contrário, a classe tenta localizar o criador do objeto e se o designer pode ser encontrado e é 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 determinado objeto. Um descritor de tipo estendido é um descritor de tipo personalizado que oferece propriedades de outros objetos adicionou a este objeto, mas na verdade não são definidos no objeto. Por exemplo, o.Modelo de componente do NET Framework, os objetos que implementam o IExtenderProvider interface pode anexar a propriedades de 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.

ObservaçãoObservação

Embora o.Modelo de componente do NET Framework somente 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 suporta proprietário.

Consulte também

Referência

TypeDescriptor

TypeDescriptionProvider

TypeDescriptionProviderAttribute

ICustomTypeDescriptor

CustomTypeDescriptor

IContainer

IDesigner

Outros recursos

Estendendo suporte em tempo de design