Holen Sie sich die Standard propertyDescriptors für einen Typ
-
09-09-2019 - |
Frage
Ich bin Customizing, wie ein Objekttyp in einem PropertyGrid
durch die Implementierung ICustomTypeDescriptor
angezeigt wird. Ich bin so dass der Benutzer ihre eigenen Eigenschaften zu schaffen, die in einem einzigen Wörterbuch von Schlüsseln und Werten gespeichert sind. Ich bin in der Lage alle PropertyDescriptors
für diese Werte zu schaffen und sie im Eigenschaftenraster anzuzeigen. Allerdings möchte ich auch alle Standardeigenschaften zeigen, die gezeigt hätte sonst, wenn die PropertyGrid
durch Reflexion bevölkert war eher als meine Überschreibung ICustomTypeDescriptor.GetProperties
Methode.
Jetzt weiß ich, wie die Art des Objekts zu erhalten, und dann GetProperties()
, aber das gibt einen Array von PropertyInfo
nicht ProperyDescriptor
. Also, wie kann ich das PropertyInfo
Objekt des Typs in PropertyDescriptor
Objekte enthält in meine Sammlung mit dem benutzerdefinierten PropertyDescriptors
umwandeln?
//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);
Lösung
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(thisType);
Als Nebenwirkung. Wird dies nicht Ihre ICustomTypeDescriptor
Anpassungen umfassen, aber es wird sind keine Anpassungen über TypeDescriptionProvider
gemacht
(edit)
Als eine zweite Seite - Sie können auch PropertyGrid
optimieren, indem eine TypeConverter
Bereitstellung - viel einfacher als entweder ICustomTypeDescriptor
oder TypeDescriptionProvider
- zum Beispiel:
[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);
}
}