net - what can be done with reflection in c#
Reparto con GetType() (5)
No puedo pensar en por qué querría lanzar como GetType (), porque no podría hacer nada útil con el resultado, sin saber el tipo en tiempo de compilación de todos modos.
Quizás lo que estás buscando es poder convertir. Si ese es el caso, lo siguiente debería funcionar para usted:
object input = GetSomeInput();
object result = Convert.ChangeType(input, someOtherObject.GetType());
Usamos esto cuando leemos valores del registro que están almacenados como cadenas y luego los rellenamos en propiedades usando la reflexión.
¿Es posible convertir un objeto al tipo devuelto por GetType()
? Me gustaría un método genérico que pueda aceptar un objeto (para tipos anónimos) pero luego devolver un molde de objeto como el tipo anónimo. He estado pensando en usar LCG DynamicMethod para construir un método en una clase de contenedor, pero no puedo entender exactamente cómo se vería. La idea de lanzar con el método GetType()
era poder obtener el tipo anónimo y convertir un objeto a su tipo real sin saber realmente el tipo.
El objetivo general es colocar objetos anónimos en un contenedor, que luego podría compartir y pasar de un método a otro.
Puede usar el método Activator.CreateInstance
para crear una instancia de un tipo.
La reflexión FYI es SLOOWWWW, por lo que si necesita hacer esto varias veces seguidas, puede ser mejor definir sus tipos en una enumeración o algo así y luego crear instancias sin usar el reflejo.
Puede usar getClass () que devuelve un objeto Class y luego usar el método cast en el objeto Class para convertir el objeto a un objeto del tipo de esa clase, así:
myObj.getClass (). cast (myObj)
Tengo una clase que utilizo para el seguimiento de cambios en mi aplicación de Windows Forms porque no todos los artículos están databound . La mayoría de los elementos eran controles TextBox , pero también había controles ComboBox y DateTimePicker .
Para simplificar, mi propiedad HasChanged
prueba el Windows.Forms.Control genérico para ver si es un ComboBox , pero puede probar cualquier tipo de controles que agregue a su Windows Form.
Debajo está esa clase, si ayuda para alguien.
internal class DataItem
{
private static Color originalBackColor, changedBackColor, originalForeColor, changedForeColor;
private static Font originalFont, changedFont;
static DataItem()
{
originalBackColor = SystemColors.Control;
changedBackColor = SystemColors.HighlightText;
originalForeColor = Color.Black;
changedForeColor = Color.Red;
originalFont = new Font(FontFamily.GenericSansSerif, 12.5f);
changedFont = new Font(originalFont, FontStyle.Bold);
}
public static void ChangeSetup(Control original, Color changedBackgroundColor)
{
originalBackColor = original.BackColor;
originalForeColor = original.ForeColor;
originalFont = original.Font;
changedBackColor = changedBackgroundColor;
changedFont = new Font(originalFont, FontStyle.Bold);
}
private bool changeTracking;
public DataItem(Control control, Object value)
{
this.Control = control;
var current = String.Format("{0}", Control.Text).Trim();
if (Control is ComboBox)
{
var cbo = (ComboBox)Control;
current = cbo.StateGet();
}
this.OriginalValue = current;
this.Control.TextChanged += Control_TextChanged;
changeTracking = true;
}
public Control Control { get; private set; }
private void Control_TextChanged(Object sender, EventArgs e)
{
if (TrackingChanges)
{
if (HasChanged)
{
this.Control.BackColor = originalBackColor;
this.Control.Font = originalFont;
this.Control.ForeColor = originalForeColor;
}
else
{
this.Control.BackColor = changedBackColor;
this.Control.Font = changedFont;
this.Control.ForeColor = changedForeColor;
}
}
}
public bool HasChanged
{
get
{
var current = String.Format("{0}", Control.Text).Trim();
if (Control is ComboBox)
{
var cbo = (ComboBox)Control;
current = cbo.StateGet();
}
return !current.Equals(OriginalValue);
}
}
public String OriginalValue { get; private set; }
public void Reset()
{
changeTracking = false;
this.OriginalValue = String.Empty;
this.Control.Text = String.Empty;
this.Control.BackColor = originalBackColor;
this.Control.Font = originalFont;
this.Control.ForeColor = originalForeColor;
}
public bool TrackingChanges
{
get
{
return changeTracking;
}
}
}
Tu intento no está muy claro; sin embargo, una opción es genéricos y MakeGenericMethod
en particular. ¿Qué quieres hacer con esto? Por ejemplo:
static class Program
{
static void Main()
{
object obj = 123.45;
typeof(Program).GetMethod("DoSomething")
.MakeGenericMethod(obj.GetType())
.Invoke(null, new object[] { obj });
}
public static void DoSomething<T>(T value)
{
T item = value; // well... now what?
}
}
Así que ahora tenemos el valor, mecanografiado como double
vía genéricos, pero todavía no hay mucho que podamos hacer excepto llamar a otros métodos genéricos ... ¿qué es lo que quiere hacer aquí?