2014-12-19 14 views
5

Ben koleksiyonları için özel bir ExpandableObjectConverter tanımlanmış:Özellik ızgarası genişletme genel bir uygulama için tüm Liste <T> tür tanımlayıcıları ekleyin?

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

: Bu yöntemi kullanarak

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

:

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" 
    } 
} 

Ve ayrıca sahip özünde yapar ExpandableObjectManager denilen bir vekil sınıf, Tüm jenerik List<T>'un propeda genişletilebileceği şekilde tip tanımlayıcı eklemek mümkün mü? rty ızgarası? Örneğin, basit bir Employee sınıfı verilen:

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

bunu yapabilirim (ve fakat sadece List<Employee> için çalışır):

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

Bütün T değil, sadece Employee bahsetmek istediğimiz, Her olası sınıf için 1 satır yazmak zorunda kalmadan. Bunu denedim - işe yaramadı:

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

TL; DR:

enter image description here

Beklenen sonuçlar: özellik ızgara SelectedObject olarak ayarlanmış bir listesi Varsayılan görünüm :

( )

List<Employee> için bir tür tanımlayıcı eklemek zorunda kalmadan ve tüm List<T> için bazı genel işleyicilere sahip olmak yerine.

cevap

2

Düzenleme: Üçüncü bir olasılık ekledim.

bir arayüz genel tür uygular için TypeConverterAttribute ekleyin:

bunlardan herhangi biri burada üç ihtimal harika çözümler vardır ama sanmıyorum. Buradaki dezavantajı, hedeflediğiniz türlere tam olarak isabet etmemenizdir, ancak seçenek 2'den daha iyidir, çünkü istediğiniz türlere oldukça fazla odaklanmıştır.

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

object türüne TypeConverterAttribute ekleyin. Dezavantajı, bu, tür çeviricinizi projenizdeki tüm tipler için tip çeviriciye dönüştürecek olmasıdır.

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

Cevabınız için

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

Teşekkür List<> devralır ve statik yapıcı kendini kayıt bulunduğunuz kendi liste türü oluşturun. Ne yazık ki, her iki seçenek de benim için işe yaramaz, çünkü # 1 bazı nesneler zaten kendi başımı kurarsam kırılabilir bir nesne dönüştürücüsünün iyi bir uygulamasına sahip olurlar. Örneğin, enums.# 2 Listeyi göstermek için özel bir sınıf oluşturmak istemiyorum. Programa gereksiz karmaşıklık katıyor. Ayrıca mevcut meclisler bunu kullanamazlar. – Neolisk

+1

Tamamen anlaşılabilir. Daha iyi bir seçenek bulursam paylaşırım. – Grax

+0

Üçüncü bir seçenek ekledim. İlk önce onu listeledim, çünkü en canlı görünüyor. – Grax

İlgili konular