Obtenez les propertyDescriptors par défaut pour un type
-
09-09-2019 - |
Question
Je personnalisant comment un type d'objet est affiché dans une PropertyGrid
en mettant en œuvre ICustomTypeDescriptor
. Je permet à l'utilisateur de créer leurs propres propriétés personnalisées qui sont stockées dans un dictionnaire unique des clés et des valeurs. Je suis en mesure de créer toutes les PropertyDescriptors
pour ces valeurs et de les voir dans la grille de la propriété. Cependant, je veux aussi montrer toutes les propriétés par défaut qui aurait autrement si le PropertyGrid
représentés était peuplée par la réflexion plutôt que ma méthode de ICustomTypeDescriptor.GetProperties
override.
Maintenant, je sais comment obtenir le type de l'objet, puis GetProperties()
, mais retourne un tableau de PropertyInfo
pas ProperyDescriptor
. Alors, comment puis-je convertir l'objet PropertyInfo
du type en objets PropertyDescriptor
inclure dans ma collection avec le PropertyDescriptors
personnalisé?
//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);
La solution
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(thisType);
En aparté. Cela ne comprend pas vos personnalisations ICustomTypeDescriptor
, mais inclure toutes les personnalisations effectuées via TypeDescriptionProvider
(modifier)
En tant que deuxième côté - vous pouvez également modifier PropertyGrid
en fournissant un TypeConverter
- beaucoup plus simple que ce soit ICustomTypeDescriptor
ou TypeDescriptionProvider
- par exemple:
[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);
}
}