Pergunta

Considere o seguinte código.

Object obj;
PropertyDescriptorCollection A = TypeDescriptor.GetProperties(obj);
PropertyInfo[] B = obj.GetType().GetProperties(); // EDIT*

Eu estou tentando entender a diferença entre A e B. Pelo que eu entendo TypeDescriptor.GetProperties () retornará personalizado TypeDescriptor Propriedades, onde como Type.GetProperties () só retornará intrínseca propriedades "reais" do objeto. Isto está certo? Se obj não tem qualquer personalizado TypeDescriptor Propriedades, em seguida, ele apenas o padrão é também devolver as propriedades intrínsecas literais do objeto.


* Original segunda linha de código antes EDIT (tinha valor de retorno errado):

PropertyDescriptorCollection B = obj.GetType () GetProperties ();.

Foi útil?

Solução

obj.GetType().GetProperties() não retorna um PropertyDescriptorCollection, ele retorna um System.Reflection.PropertyInfo[]. A classe PropertyInfo faz, como você sugere, representam apenas propriedades reais criados no objeto. A PropertyDescriptor ou é uma criança personalizado concreto da classe PropertyDescriptor (implementado pelo tipo definindo o descritor de costume), ou é uma instância da ReflectPropertyDescriptor classe interna selada que usa a classe PropertyInfo para fornecer invocação dinâmica da propriedade.

Assim, para uma classe que não define um descritor de costume, você vai funcionalmente obter os mesmos objetos de volta, embora o PropertyDescriptor é abstrair o PropertyInfo.

Outras dicas

A classe TypeDescriptor é usado em desenhadores, para que possam interagir com o ambiente de tempo de design. Em particular, os designers podem substituir e ampliar várias características de TypeDescriptor, mas não Type.

Um exemplo bom está trabalhando com controles ligados a dados. A propriedade DataSource é do tipo System.Object, ainda em tempo de design, que a propriedade é substituída por uma nova propriedade que tem uma interface de usuário em tempo de design mais rico.

A classe TypeDescriptor retornos PropertyDescriptor objetos que representam as propriedades do tipo de obj, bem como quaisquer outras propriedades que foram contribuíram para o próprio ou ao seu tipo de objeto.

O modelo de componente é realmente muito complexo, mas como você descreve, a implementação básica de TypeDescriptor.GetProperties() retornará casos ReflectPropertyDescriptor que representam um engano aos objetos PropertyInfo típicos. Você pode usar PropertyDescriptor objetos muito parecido com objetos PropertyInfo: elas podem ser usadas para obter e definir o valor da propriedade e eles têm atributos.

Para os casos em DependencyObject WPF, TypeDescriptor.GetProperties() também retorna propriedades anexado. Esses objetos PropertyDescriptor neste caso fornecer um engano ao modelo de objeto de dependência ao invés de reflexão.

No designer de componente, é possível usar ICustomTypeDescriptor ou TypeDescriptionProviderAttribute (e talvez algumas outras técnicas) para criar seus próprios objetos PropertyDescriptor em tempo de execução ou pelo designtime. Em qualquer caso, é possível que as propriedades retornados Type.GetProperties() pode muito bem diferir daqueles retornou de TypeDescriptor, dependendo do contexto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top