Clonar un Control
En uno de los foros en que participo, un colega preguntó cual era la forma de crear copias idénticas ('clones') de una Caja de Edición (TextBox) en tiempo de ejecución. Intenté ver si los controles incluían algún constructor que tomara un parámetro tipo Control y creara una copia a partir de éste, lamentablemente los controles no incluyen tal constructor (pienso que sería útil)
Aqui planteo la forma de crear 'clones' de un control (en realidad, de cualquier objeto), usando Reflection.
Versión C#
private void Clonar(object src, object tgt)
{
PropertyInfo[] props = src.GetType().GetProperties();
foreach (PropertyInfo pi in props)
{
if (pi.CanWrite)
pi.SetValue(tgt, pi.GetValue(src, null), null);
}
}
No hay que olvidar incluir un using System.Reflection
Asumamos que hemos creado un TextBox llamado tbOriginal y hemos personalizado el tipo de letra, el tamaño, etc. Si queremos crear una copia idéntica usando el método Clonar definido antes, usariamos algo asi:
TextBox tbClon = new TextBox();
Clonar (tbOriginal, tbClon);
ya tenemos la copia, y solo nos quedaría modificar la posición, y añadirlo al Form
tbClon.Top += 20;
this.Controls.Add(tbClon);
Como la consulta fue hecha en un foro de VB.NET, también aqui esta la traducción. Me llevó mas tiempo traducir el código que escribir la función :) VB nunca fue mi lenguaje favorito. Aqui está el código para quien le pudiera interesar
Private Sub Clonar(ByVal src As Object, ByVal tgt As Object)
Dim props As System.Reflection.PropertyInfo()
props = src.GetType().GetProperties()
For Each pi As System.Reflection.PropertyInfo In props
If pi.CanWrite Then
pi.SetValue(tgt, pi.GetValue(src, Nothing), Nothing)
End If
Next
End Sub
Hasta la próxima