Tengo una función que toma un control como parámetro, y dependiendo del tipo de control (por ej .: TextBox, ComboBox, RadioButton, etc.), ejecuta type- código específico:forma más efectiva para determinar el tipo de control en 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.....
}
Me pregunto si esta es la mejor manera de hacerlo.
Conozco otras formas de hacer lo mismo (por ejemplo: buscando el tipo de control usando GetType()
, activando la representación de cadena de este tipo), y la herramienta de análisis de código de Microsoft me dice que use 'como' en lugar de 'es' como esto (porque es mejor en cuanto al rendimiento):
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.....
}
}
}
pero encuentro esta última solución bastante prolijo y no muy práctico para leer. Me gustaría poder activar el tipo de control directamente, pero no puedo hacerlo sin recurrir al uso de la representación de cadena (que no me gusta en absoluto) ya que la declaración de caso de un conmutador no puede contener una variable.
Entonces, ¿cuál es realmente la mejor manera de hacer rendimiento? y cuál es, en tu opinión, la mejor manera de hacerlo? (No necesariamente en cuanto al rendimiento, pero "código-lectura-sabia", por ejemplo)
Editar: como mucho está pasando sobre el tema de "¿Por qué utilizo una función común y no muchos tipo-específica métodos ", aquí hay algo más de información:
Obtengo una variable de control de otra parte de la aplicación en la que estoy trabajando (type = Control) y hago" hacer algo "con esta variable, dependiendo de su tipo.
básicamente, puedo elegir entre 2 opciones: o bien utilizo una función común y verifico el tipo de control en el cuerpo de la función para poder ejecutar la parte correcta del código en algún punto (opciones que he elegido por ahora , pero esto podría cambiar), o verifico el tipo de control ANTES de llamar a un método específico de tipo.
de cualquier manera, tengo que cambiar el tipo de control en algún momento, y ESTE es el tema de mi pregunta (independientemente de lo que hago con él, si se me permite decirlo).
+1 solo para el Diccionario, no sabía nada de esto. Voy a echar un vistazo y ver si encaja. ¡Se ve bien! :) – David
+1: No me gusta hacer un cambio/if-else en el tipo, se siente mal. Esto es mucho más limpio. –
+1: el RegisterHandler genérico es particularmente limpio. – Gibsnag