eventos - propiedad tag c#
Reproduzca el objeto del remitente en el controlador de eventos usando GetType(). Nombre (10)
Dependiendo de las propiedades que necesite, puede convertir al remitente como TextBoxBase, ya que tanto TextBox como RichTextBox heredan de esa subclase.
Tengo un controlador de eventos para un cuadro de texto, así como para un RichTextBox. El código es idéntico, pero
En el controlador # 1 hago:
RichTextBox tb = (RichTextBox)sender
En el controlador # 2 en consecuencia:
TextBox tb = (TextBox)sender
Al hacerlo, puedo manipular completamente el control de envío. Lo que quiero saber es cómo puedo enviar el objeto de envío a Textbox o RichTextbox según su tipo usando
sender.GetType().Name
y luego crear el control en tiempo de ejecución y trabajar con él. De esa forma solo necesito una función de controlador de eventos: menos código, menos errores, más fácil de mantener y DRY :-)
En lugar del nombre de tipo que podría usar '' is ''.
Si solo quiere saber el tipo y no necesita una referencia de objeto:
if (sender is RichTextBox)
{
// ...
}
else if (sender is TextBox)
{
// ...
}
Sin embargo, generalmente desea el objeto: C # 7 tiene una buena sintaxis que le permite probar y obtener el valor en línea:
if (sender is RichTextBox richTextBox)
{
richTextBox.Text = "I am rich";
}
else if (sender is TextBox textBox)
{
textBox.Text = "I am not rich";
}
La conversión solo se puede realizar en tiempo de compilación y, por lo tanto, debe conocer los tipos que desea convertir en tiempo de compilación. Por lo tanto, no se puede usar un Tipo de tiempo de ejecución (tal como lo devuelve GetType ()) al realizar la conversión.
Si lo que buscas es el polimorfismo, puedes acceder a la propiedad Nombre a través de la reflexión. Sin embargo, no me gustaría ir solo para poder reutilizar los controladores de eventos.
Si desea una escritura fuerte, la única manera de ir es una clase base común o una interfaz en los dos remitentes.
Nunca tienes que lanzar. Solía pensar de la misma manera cuando empecé, este "patrón" es incorrecto y no es realmente lógico.
Tu mejor apuesta es usar algo como:
if (sender is TextBox)
{
TextBox tb = (TextBox)sender;
}
else if (sender is RichTextBox)
{
RichTextBox rtb = (RichTextBox)sender;
}
else
{
// etc
}
Sé que esta es una publicación muy antigua, pero en Framework 4 puedes enviar el remitente como un Control:
Control cntrl = (Control)sender;
cntrl.Text = "This is a " + sender.GetType().ToString();
Tenga en cuenta que solo puede hacer referencia a los controles que todos los diferentes controles tienen en común (es decir, Texto).
Si el código es idéntico, ¿necesitas cuidar? Me pregunto si el casting a Control
no te daría todo lo que necesitas ...
Un manejador complejo no es necesariamente mejor que varios manejadores simples. De cualquier manera, si tiene que seguir esta ruta, es preferible "como" / "es" (no depende de cadenas, etc.):
TextBox tb = sender as TextBox;
if(tb!=null) {/* TextBox specific code */}
...
Si no desea repetir el código, entonces puede convertir ambos controles, refactorizar las acciones comunes a un método separado que toma TextBoxBase como un argumento. Y en su evento, los controladores convierten los controles a System.Windows.Forms.TextBoxBase ya que ambos controles se derivan de TexbBoxBase y llaman al método.
Tenga en cuenta que si necesita propiedades específicas de cualquiera de estos controles, esta refactorización no funcionará.
También puede usar una variable temporal en línea para manejar la conversión por usted.
if (sender is RichTextBox tb)
{
// ... //
}
else if (sender is TextBox tb)
{
// ... //
}
Versión genérica del código anterior:
public static void CastAndUse<T>(object item, Action<T> action) where T : class
{
T thing = item as T;
if (thing != null)
{
action(thing);
}
}
Usado como:
CastAndUse(sender, new Action((foo) => foo = bar));
No perfecto, pero práctico.
RichTextBox textbox = sender as RichTextBox;
if (textbox != null)
{
// do stuff as a rtb
textbox.Text = "I''m a rtb";
return;
}
TextBox textbox = sender as TextBox;
if (textbox != null)
{
// do stuff as a textbox
textbox.Text = "I''m a textbox";
}