ho definito una consuetudine ExpandableObjectConverter
per le collezioni:Aggiungere i descrittori di tipi a tutti gli elenchi <T> per un'implementazione generica dell'espansione della griglia di proprietà?
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"
}
}
E hanno anche una classe proxy chiamato ExpandableObjectManager
, che in sostanza fa questo:
TypeDescriptor.AddAttributes(type,
new TypeConverterAttribute(typeof(ExpandableCollectionConverter)));
Utilizzando questo metodo:
public static class ExpandableObjectManager
{
public static void AddTypeDescriptor(Type tItem)
{
//eventually calls TypeDescriptor.AddAttributes
}
}
È possibile aggiungere il descrittore di tipo in modo tale che tutti i generici List<T>
siano espandibili nella prope griglia? Ad esempio, dato un semplice Employee
classe:
class Employee
{
public string Name { get; set; }
public string Title { get; set; }
public DateTime DateOfBirth { get; set; }
}
posso fare questo (e funziona, ma solo per List<Employee>
):
ExpandableObjectManager.AddTypeDescriptor(typeof(List<Employee>));
Vorrei coprire tutte T
, non solo Employee
, senza dover scrivere 1 riga per ogni classe possibile. Ho provato questo - non ha funzionato:
ExpandableObjectManager.AddTypeDescriptor(typeof(List<>));
TL; DR: Vista predefinita di un elenco quando impostato come SelectedObject
nella griglia delle proprietà:
risultati attesi :
Senza dover aggiungere un descrittore di tipo per List<Employee>
e avere invece un gestore generico per tutti List<T>
.
Grazie per la risposta. Sfortunatamente, nessuna delle due opzioni funziona per me, perché # 1 alcuni oggetti hanno già una buona implementazione di un convertitore di oggetti espandibile, che io avrei interrotto, se avessi impostato il mio. Ad esempio, enum.# 2 Non voglio creare una classe personalizzata per rappresentare l'elenco. Aggiunge complessità non necessaria al programma. Anche gli assiemi esistenti non possono usarlo. –
Neolisk
Totalmente comprensibile. Se trovo un'opzione migliore, la condividerò. – Grax
Ho aggiunto una terza opzione. L'ho elencato per primo perché sembra ancora il più praticabile. – Grax