I PropertyDescriptors di default per un tipo
-
09-09-2019 - |
Domanda
Sono la personalizzazione come un tipo di oggetto viene visualizzato in una PropertyGrid
implementando ICustomTypeDescriptor
. Sto permettendo all'utente di creare i propri proprietà personalizzate che vengono memorizzate in un unico dizionario di chiavi e valori. Sono in grado di creare tutte le PropertyDescriptors
per questi valori e visualizzarli nella griglia proprietà. Tuttavia, ho anche voglia di mostrare tutte le proprietà predefinite che altrimenti sarebbe disponibile se il PropertyGrid
era popolata attraverso la riflessione piuttosto che il mio metodo di sostituzione ICustomTypeDescriptor.GetProperties
.
Ora so come ottenere il tipo di oggetto, e poi GetProperties()
, ma questo restituisce un array di PropertyInfo
non ProperyDescriptor
. Così come posso convertire l'oggetto PropertyInfo
del tipo in oggetti PropertyDescriptor
di includere nella mia collezione con l'PropertyDescriptors
personalizzato?
//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);
Soluzione
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(thisType);
Per inciso:. Questo non includerà le vostre personalizzazioni ICustomTypeDescriptor
, ma includere eventuali personalizzazioni effettuate tramite TypeDescriptionProvider
(modifica)
Come secondo a parte - è anche possibile modificare PropertyGrid
fornendo un TypeConverter
- molto più semplice di quanto sia ICustomTypeDescriptor
o TypeDescriptionProvider
- ad esempio:
[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);
}
}