2012-02-15 20 views
5

現在、私はいくつかのフィールドを追加してカスタマイズした.NETを作成する必要があるツールで作業しています。私はこれを解決するために、より良い何であるかのアプローチ思ってきたし、次のオプションに考えて:.NETコントロールへの機能拡張

オプションA: - 各コントロールの派生クラスを作成します(clabelが、CGroupBox、のは言わせて...)ここで私は各クラスの新しいフィールドを定義します。これはの悪化を意味しますが、で操作するのは簡単です。

例:

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

    public CLabel() 
    {} 
} 

オプションB: - このオプションは、各コントロールから派生したクラスを作成し、実際のラベル、グループボックスなどのコントロールを使用してカプセル化するクラスを作成しない意味するすべて"余分な"特性。この追加のプロパティオブジェクトは、Control.Tagプロパティで参照されます。 Tagプロパティ内の複雑なオブジェクトを参照することは私にはちょっと気分が悪いと感じていますが、このは、コントロールのサブクラス化を行う必要はありません。

例:

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

オプションC: - これは一例clabelがために、カスタムコントロールを作成するオプションAとBの組み合わせのいくつかの並べ替えを持つ意味し、タイプControlDescriptionフィールドを追加しますLabelコントロールに追加します。この方法でカプセル化とメンテナンスを保証しますが、Tagの事は避けてください。

私は確かにそこより多くのオプションがあります。おそらく多形性(私はまだ問題がある概念)を使用しているのでしょうか?カスタムコントロールクラスは取り除くことができます。これらのオプションのどれがあなたが最高のものと思いますか?このすべてがよりうまくいくと思いますか?

答えて

2

あなたは、デザイン時にプロパティを容易に制御する必要があり、Windowsフォームで行かなければならない場合は、このhttp://msdn.microsoft.com/en-us/library/system.componentmodel.iextenderprovider.aspx

で、あなたは彼らに最初のコントロールをラップすることなく、別のコントロールにプロパティを提供することができます。この方法は、ロックを持っている必要があります。

+0

ありがとう、私もこれを見ていきます。 –

1

私が正しく理解していれば、ここでは拡張メソッドを使用することをお勧めします。各コントロールにいくつかのカスタム値を保存する必要がある場合は、静的な辞書(Control、Value)に保存することができますが、拡張メソッドを使用してアクセスするので、いくつかの値を持つコントロールがあるように見えます。「

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

それはあなたのようなものだ:おそらくあなたはこれを試みることができる

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

何らかのディクショナリを持っているのもよい解決策です。私が間違っていなければ、.NETコントロールを拡張する必要はありません。私が知らないことがあるので、拡張メソッドを見てみましょう。 –

0

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

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

あなたのようなこの方法を使用することができた後:

は例を追加しましたオプションB "を使用するが、"タグ "プロパティを使用しない。