2015-10-30 22 views
5
//list the controls from the main form 
foreach (Control c in Controls) 
{ 
    if (c is ComboBox) 
    { 
     ((ComboBox)c).SelectedIndex = -1; 
    } 
    else if (c is TextBox) 
    { 
     ((TextBox)c).Text = ""; 
    } 
    else if (c is CheckBox) 
    { 
     ((CheckBox)c).Checked = false; 
    } 
    //etc. with FIFTY different types to check against 
} 
+0

よくC#7でそれは確かにこのような問題を解決することができます...しかし、今日のバージョンではなく、それほど多くはありません。 –

+1

ここでの目標は何ですか? –

+0

私は50のコントロールのためにこの仕事をする必要があります.... – fre3land

答えて

6

このメソッドを使用:

public void Set(object obj, string property, object value) 
{ 
    //use reflection to get the PropertyInfo of the property you want to set 
    //if the property is not found, GetProperty() returns null 
    var propertyInfo = obj.GetType().GetProperty(property); 
    //use the C# 6 ?. operator to only execute SetValue() if propertyInfo is not null 
    propertyInfo?.SetValue(obj, value); 
} 

はこのようにそれを呼び出します。

foreach (Control c in Controls) 
{ 
    Set(c, "SelectedIndex", -1); 
    Set(c, "Text", ""); 
    Set(c, "Checked", false); 
} 
+1

これは、おかげさまで助けてくれます。 – fre3land

+2

それは50回ごとにすべてのチェックを実行するのではありませんか? – AlG

+0

@AIG - 確かに、それはここでそのperf問題です。私はまた、C#6 + –

9

一つの方法は、dynamicにキャスト特定のタイプのための3つのオーバーロードされたメソッドを追加し、このような呼び出しを行うことです。

foreach (dynamic c in Controls) { 
    ClearOut(c); 
} 
... 
private static void ClearOut(ComboBox c) { 
    c.SelectedIndex = -1; 
} 
private static void ClearOut(TextBox t) { 
    t.Text = string.Empty; 
} 
private static void ClearOut(CheckBox c) { 
    c.Checked = false; 
} 

cdynamicあるので、C#はランタイムするClearOut方法の結合を延期します、きれいなコードを提供します。このアプローチの欠点は、オーバーロードの1つが欠けていると、C#がコンパイル時に通知できないことです。あなたのコントロールのプロパティを設定するには

+0

これらのすべての型が' Control'から派生しているのであれば、なぜ動的が必要なのかわかりません。 –

+0

本当にいいです。私はこれを知らなかった。 50メソッドは短くなることはありません –

+0

voidのようなメソッドを実装することは可能ですか? – fre3land

3

あなたがのコントロールをクリアアクションにサポートされている各タイプから、ルックアップを作成することができますそのタイプに対応するタイプごとにその参照にハンドラを追加することができます:

public class ControlClearer 
{ 
    private static Dictionary<Type, Action<Control>> lookup = new Dictionary<Type, Action<Control>>(); 

    static ControlClearer() 
    { 
     AddMapping((TextBox control) => control.Text = ""); 
     AddMapping((ComboBox control) => control.SelectedIndex = -1); 
     AddMapping((CheckBox control) => control.Checked = false); 
    } 

    private static void AddMapping<T>(Action<T> clearAction) 
     where T : Control 
    { 
     lookup[typeof(T)] = control => clearAction((T)(object)control); 
    } 

    public static void Clear<T>(T control) 
     where T : Control 
    { 
     //todo support case where T isn't in the dictionary 
     lookup[typeof(T)](control); 
    } 

    public static void Clear(Control control) 
    { 
     //todo support case where the type isn't in the dictionary 
     lookup[control.GetType()](control); 
    } 
} 
関連する問題