//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
}
答えて
このメソッドを使用:
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);
}
一つの方法は、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;
}
c
がdynamic
あるので、C#はランタイムするClearOut
方法の結合を延期します、きれいなコードを提供します。このアプローチの欠点は、オーバーロードの1つが欠けていると、C#がコンパイル時に通知できないことです。あなたのコントロールのプロパティを設定するには
これらのすべての型が' Control'から派生しているのであれば、なぜ動的が必要なのかわかりません。 –
本当にいいです。私はこれを知らなかった。 50メソッドは短くなることはありません –
voidのようなメソッドを実装することは可能ですか? – fre3land
あなたがのコントロールをクリアアクションにサポートされている各タイプから、ルックアップを作成することができますそのタイプに対応するタイプごとにその参照にハンドラを追加することができます:
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);
}
}
- 1. このクエリを短縮する方法はありますか?
- 2. このCコードよりも短い配列の長さを見つける方法はありますか?
- 3. このPHPコードをデコードする方法はありますか?
- 4. このPythonジェネレータ表現を短縮する方法はありますか?
- 5. このjQueryスクリプトを短縮する方法はありますか?
- 6. Pythonクラスメソッド - 呼び出しを短くする方法はありますか?
- 7. 色を短くする方法または短くする方法
- 8. Rails/Ruby:スタックトレースを短縮する方法はありますか?
- 9. VIMでコマンドを短縮する方法はありますか?
- 10. PHP - このコードを短くする
- 11. このhtml/razorコードを書く簡単な方法はありますか?
- 12. このコードを簡単に書く方法はありますか?
- 13. このコードを書くより良い方法はありますか?非常に醜いコードですか?
- 14. ビルド時間を短縮する方法/ XCodeでコンパイル時間を短縮する方法はありますか?
- 15. コードを書くことなくsqldatasourceの行数を取得する簡単な方法はありますか?
- 16. MySQLクエリを短縮する方法はありますか?これには多くの条件がありますか?
- 17. 同時モジュラ方程式を解くコードはありますか?ここ
- 18. 私は持っているこのコードを書くより効率的/エレガントな方法はありますか?
- 19. このコードを少しリファクタリングする方法はありますか?
- 20. このPythonコードを修正する方法はありますか?
- 21. このコードを最適化する方法はありますか?
- 22. このJavaScriptコードをもっと圧縮する方法はありますか?
- 23. このJavaScriptコードをさらにデカップリングする方法はありますか?
- 24. このC#コードを最適化する方法はありますか?
- 25. ストリームのreduce()操作を短絡する方法はありますか?
- 26. このjQueryを短くすることはできますか?
- 27. JavaScriptコードを分離する際の短所はありますか?
- 28. IEの下でコードを破ることなくコンソールにログする方法はありますか?
- 29. このC#コードを組み合わせる方法はありますか?
- 30. は、このpythonプログラムを高速化する方法はありますか? (短い)
よくC#7でそれは確かにこのような問題を解決することができます...しかし、今日のバージョンではなく、それほど多くはありません。 –
ここでの目標は何ですか? –
私は50のコントロールのためにこの仕事をする必要があります.... – fre3land