我有一个将控件作为参数的函数,并根据控件的类型(例如:TextBox,ComboBox,RadioButton等)执行type-具体代码:在C#/ WPF中确定控件类型的最有效方法
internal static void DoSomething(Control control)
{
if (control is Button)
{
// code for button
}
else if (control is CheckBox)
{
// code for CheckBox
}
else if (control is TextBox)
{
// code for TextBox
}
// etc.....
}
我想知道这是否是最好的方法。
我知道一些其他方式来做同样的事情(例如:寻找控制的类型使用GetType()
,切换这种类型的字符串表示),微软的代码分析工具告诉我使用'as'而不是“就是”这样的(因为它是更好的性能明智):
internal static void DoSomething(Control control)
{
Button button = control as Button
if (button != null)
{
// code for button
}
else
{
CheckBox checkBox = control as CheckBox;
if (checkBox != null)
{
// code for CheckBox
}
else
{
TextBox textBox = control as TextBox;
if (textBox != null)
{
// code for TextBox
}
// etc.....
}
}
}
,但我觉得这是最后的解决方案,而罗嗦,而不是非常实用的阅读。 我希望能够直接打开控件的类型,但无法通过使用字符串表示(我根本不喜欢),因为switch的case语句不能包含变量。
那么真正做到性能最好的方法是什么?在你看来,最好的办法是什么? (例如,不一定表现明智,但是“代码可读性明智”)
编辑:随着“为什么我要使用一个通用函数而没有多少类型特定方法“,这里是一些更多的信息:
我从我正在工作的应用程序的其他部分(type = Control)获得一个控制变量,并且我已经对此变量执行”执行某些操作“,具体取决于它类型。
所以基本上,我有两个选择之间的选择:要么我使用一个普通的函数,并检查控件在函数体中的类型,以便在某个点执行代码的正确部分(我现在选择的选项,但这可能会改变),或者在调用类型特定的方法之前检查控件的类型。
无论哪种方式,我必须在某个时间点打开控制的类型,而这个是我的问题的主题(不管我如何处理它,如果我可以这样说的话)。
+1,我不知道这个东西。我要看看它是否合适。看起来不错! :) – David 2011-03-14 14:53:58
+1:我不喜欢做switch/if-else类型,感觉不对。这更清洁。 – 2011-03-14 14:55:01
+1:泛型RegisterHandler特别整洁。 – Gibsnag 2011-03-14 15:01:04