TypeDescriptor.GetProperties (vs) () Type.GetProperties
-
05-07-2019 - |
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 ();.
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.