//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. コードを短くする方法はありますか?
- 3. このコードの長さを短くする方法はありますか?
- 4. このコードの長さを短くする方法はありますか?同じことをしますか?
- 5. このコードの方が短いバージョンはありますか?
- 6. このクエリを短縮する方法はありますか?
- 7. このリストの理解を短くする方法はありますか?
- 8. この短いコードを減らす方法はありますか?
- 9. これを短縮する方法はありますか?
- 10. このCコードよりも短い配列の長さを見つける方法はありますか?
- 11. このPHPコードをデコードする方法はありますか?
- 12. このRxJavaコードをリファクタリングする方法はありますか?
- 13. このコードをスレッドセーフにする方法はありますか?
- 14. このPythonジェネレータ表現を短縮する方法はありますか?
- 15. このjQueryスクリプトを短縮する方法はありますか?
- 16. Pythonクラスメソッド - 呼び出しを短くする方法はありますか?
- 17. Rails/Ruby:スタックトレースを短縮する方法はありますか?
- 18. VIMでコマンドを短縮する方法はありますか?
- 19. このtkinterコードをループに入れて短縮する方法はありますか?
- 20. PHP - このコードを短くする
- 21. 色を短くする方法または短くする方法
- 22. C#繰り返しコードを短くする良い方法
- 23. このコードを書くための方法はありますか?
- 24. このコードを書くより良い方法はありますか?非常に醜いコードですか?
- 25. このhtml/razorコードを書く簡単な方法はありますか?
- 26. このコードを簡略関数で書く方法はありますか?
- 27. このコードを簡単に書く方法はありますか?
- 28. ビルド時間を短縮する方法/ XCodeでコンパイル時間を短縮する方法はありますか?
- 29. このコードを短くすることができます
- 30. この小さなコードをよりエレガントで最適な方法で書く方法はありますか? (ES6)
よくC#7でそれは確かにこのような問題を解決することができます...しかし、今日のバージョンではなく、それほど多くはありません。 –
ここでの目標は何ですか? –
私は50のコントロールのためにこの仕事をする必要があります.... – fre3land