2014-12-19 14 views
5

definiert ich eine benutzerdefinierte ExpandableObjectConverter für Sammlungen:Hinzufügen von Typdeskriptoren zu allen Listen <T> für eine generische Implementierung der Eigenschaftsrastererweiterung?

internal class ExpandableCollectionConverter : ExpandableObjectConverter 
{ 
    public override PropertyDescriptorCollection GetProperties(
     ITypeDescriptorContext context, object value, Attribute[] attributes) 
    { 
     //implementation that returns a list of property descriptors, 
     //one for each item in "value" 
    } 
} 

und haben auch eine Proxy-Klasse ExpandableObjectManager, die im Wesentlichen erledigt diese genannt:

TypeDescriptor.AddAttributes(type, 
    new TypeConverterAttribute(typeof(ExpandableCollectionConverter))); 

Mit dieser Methode:

public static class ExpandableObjectManager 
{ 
    public static void AddTypeDescriptor(Type tItem) 
    { 
     //eventually calls TypeDescriptor.AddAttributes 
    } 
} 

Ist es möglich, den Typdeskriptor so hinzuzufügen, dass alle allgemeinen List<T> in der Datei erweiterbar sind Grid-Gitter? Um zum Beispiel eine einfache Employee Klasse gegeben:

class Employee 
{ 
    public string Name { get; set; } 
    public string Title { get; set; } 
    public DateTime DateOfBirth { get; set; } 
} 

ich das tun kann (und es funktioniert, aber nur für List<Employee>):

ExpandableObjectManager.AddTypeDescriptor(typeof(List<Employee>)); 

würde Ich mag alle T decken, nicht nur Employee, ohne eine Zeile für jede mögliche Klasse schreiben zu müssen. Ich habe versucht, diese - nicht funktioniert:

ExpandableObjectManager.AddTypeDescriptor(typeof(List<>)); 

TL; DR: Standardansicht einer Liste, wenn sie als SelectedObject im Eigenschaftenraster festgelegt:

enter image description here

Erwartete Ergebnisse :

enter image description here

Ohne einen Typdeskriptor für List<Employee> hinzufügen und stattdessen einige generische Handler für alle List<T>.

Antwort

2

Edit: Ich habe eine dritte Möglichkeit hinzugefügt.

Ich glaube nicht, dass dies sind wunderbare Lösungen, aber hier sind drei Möglichkeiten:

hinzufügen Typeconverter zu einer Schnittstelle, die die generischen Typ implementiert. Der Nachteil hier ist, dass Sie nicht genau die Typen treffen können, auf die Sie zielen, aber es ist besser als Option 2, weil es ein bisschen mehr auf die Typen fokussiert ist, die Sie wollen.

TypeDescriptor.AddAttributes(typeof(IList), new 
    TypeConverterAttribute(typeof(ExpandableCollectionConverter))); 

die Typeconverter zum object Typ hinzufügen. Der Nachteil ist, dass dies Ihren Typwandler zum Typwandler für alle Typen in Ihrem Projekt macht.

TypeDescriptor.AddAttributes(typeof(object), new 
    TypeConverterAttribute(typeof(ExpandableCollectionConverter))); 

Ihre eigene Liste Art erstellen, die von List<> erbt und es haben registrieren sich im statischen Konstruktor

public class CustomList<T> : List<T> 
{ 
    static CustomList() 
    { 
     TypeDescriptor.AddAttributes(typeof(CustomList<T>), new TypeConverterAttribute(typeof(ExpandableCollectionConverter))); 
    } 
} 
+0

Vielen Dank für Ihre Antwort. Leider funktioniert keine der beiden Optionen für mich, da # 1 bei einigen Objekten bereits eine gute Implementierung eines erweiterbaren Objektkonverters hat, den ich bei der Einstellung meines eigenen zerbrechen würde. Zum Beispiel enums.# 2 Ich möchte keine benutzerdefinierte Klasse zur Darstellung der Liste erstellen. Dies fügt dem Programm unnötige Komplexität hinzu. Auch vorhandene Assemblies können es nicht verwenden. – Neolisk

+1

Völlig verständlich. Wenn ich eine bessere Option finde, werde ich es teilen. – Grax

+0

Ich habe eine dritte Option hinzugefügt. Ich habe es zuerst aufgelistet, weil es am lebensfähigsten scheint. – Grax