2012-02-15 13 views
5

kontrol eder. Ne yaklaşım bu çözmek için iyidir merak ettik ve aşağıdaki seçenekler de düşünüyordum:Genişleyen işlevselliği Şu anda bazı ek alanları ile özelleştirilmiş .NET çeşit oluşturmak için gereken bir alet çalışıyorum

Seçenek A: - Her kontrol için türetilmiş bir sınıf oluşturun (diyelim CLabel, CGroupBox ...) her sınıftaki yeni alanları tanımlarım. Bu kötü mantainability anlamına gelecektir ama ile kullanımı kolay olurdu.

Örnek:

class CLabel: Label 
{ 
    public List<Control> RelatedControls {get; set;} 
    public String textHint; 
    // more stuff... 

    public CLabel() 
    {} 
} 

B seçeneği: - Bu seçenek, her kontrol türetilmiş bir sınıf oluşturma, ancak gerçek etiket, GroupBox, vb kontrolleri kullanarak ve içine alıcı bir sınıf oluşturulmadığı anlamına gelir tüm "ekstra" özellikler. Bu ekstra özellikler nesnesi, Control.Tag özelliğinde başvurulan. Tag özelliği içinde karmaşık nesnenin bir tür referans bana biraz bok hissediyor çünkü bu bir hakkında şüphelerim var, ama bu daha iyi mantainability anlamına geleceğini ve ayrıca tabii subclassing gerek kontrol eder.

Örnek:

Label lbl = new Label(); 
lbl.Tag = new ControlDescription(); 

Seçenek C: - Bu tip ControlDescription alanı ekler örnek CLabel için, Seçenek A ve B Sadece özel denetimi oluşturma kombinasyonu çeşit sahip anlamına gelecektir Etiket kontrolüne. Bu şekilde kapsülleme ve yönetilebilirliği sağlıyoruz, ancak Tag şeyinden sakınıyoruz.

Oraya daha iyi birçok seçenek vardır eminim. Muhtemelen sadece polimorfizm kullanıyorum - hala problemlerim var - özel kontrol sınıfları alınabilir. Bu seçeneklerden hangisinin en iyisi olduğunu düşünüyorsunuz? Bunların hepsinin daha iyi olabileceğini düşünüyor musunuz?

cevap

1

Seni doğru anlarsam, burada uzantı yöntemlerini kullanmayı tercih ederim. Her denetim için bazı özel değerler depolamanız gerekiyorsa, bunları statik sözlüğünde (Denetim, Değer) saklayabilir, ancak buna erişmek için uzantı yöntemlerini kullanabilirsiniz, bu nedenle eklenmiş bazı değerlerle denetime sahip olmanız gerekir."

public class ExtensionData 
{ 
    //put your data here 
} 

public class Extended<T> 
    where T : Control 
{ 
    public Extended(T baseControl) 
    { 
     BaseControl = baseControl; 
    } 

    public T BaseControl { get; set; } 

    public ExtensionData Extension { get; set; } 
} 

web sitenizden gibi: Muhtemelen bu deneyebilirsiniz

Button btn = new Button(); 
string s = btn.GetString(); 
+0

Sözlük türlerinden biri de iyi bir çözüm ve yanlış değilse, .NET denetimlerini genişletmeye gerek yok. Uzantı yöntemlerine bir göz atacağım çünkü bilmediğim bir şey. –

0

:

public static class Extension 
{ 
    private static Dictionary<Control, string> _controlStrings; 

    public static void GetString(this Control ctrl) 
    { 
     return _controlStrings[ctrl]; 
    } 
} 

sizin gibi bu yöntemi kullanabilirsiniz Bundan sonra:

bir örnek eklendi B seçeneği, ancak "Etiket" özelliğini kullanmadan

İlgili konular