Obter os PropertyDescriptors padrão para um tipo
-
09-09-2019 - |
Pergunta
Eu estou personalizando como um tipo de objeto é exibido em uma PropertyGrid
através da implementação de ICustomTypeDescriptor
. Eu estou permitindo que o usuário crie suas próprias propriedades personalizadas que são armazenadas em um único dicionário de chaves e valores. Eu sou capaz de criar todo o PropertyDescriptors
para estes valores e visualizá-los na grade de propriedade. No entanto, eu também quero mostrar todas as propriedades padrão que de outra forma teria mostrado se o PropertyGrid
foi povoada por meio de reflexão, em vez do meu método de substituição ICustomTypeDescriptor.GetProperties
.
Agora eu sei como obter o tipo do objeto, e GetProperties()
então, mas este retorna uma matriz de não PropertyInfo
ProperyDescriptor
. Então, como posso converter o objeto PropertyInfo
do tipo em PropertyDescriptor
objetos para incluir na minha coleção com o PropertyDescriptors
personalizado?
//gets the local intrinsic properties of the object
Type thisType = this.GetType();
PropertyInfo[] thisProps = thisType.GetProperties();
//this line obviously doesn't work because the propertydescriptor
//collection needs an array of PropertyDescriptors not PropertyInfo
PropertyDescriptorCollection propCOl =
new PropertyDescriptorCollection(thisProps);
Solução
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(thisType);
Como um aparte: este não irá incluir suas personalizações ICustomTypeDescriptor
, mas irá inclui quaisquer personalizações feitas via TypeDescriptionProvider
(edit)
Como um segundo lado - você pode PropertyGrid
também beliscão, fornecendo uma TypeConverter
- muito mais simples do que qualquer ICustomTypeDescriptor
ou TypeDescriptionProvider
- por exemplo:
[TypeConverter(typeof(FooConverter))]
class Foo { }
class FooConverter : ExpandableObjectConverter
{
public override PropertyDescriptorCollection GetProperties(
ITypeDescriptorContext context, object value, Attribute[] attributes)
{
// your code here, perhaps using base.GetPoperties(
// context, value, attributes);
}
}