Buenos días a todos,
alguna vez nos hemos encontrado con la necesidad de acceder a un campo dinámicamente sin tener en cuenta como se llama? Esto podríamos usarlo para serializar, deserializar, crear funciones de debug y un largo etc..
Bueno pues eso es fácil de solucionar con la librería System.Reflection.
Siguiendo las explicaciones de la página msdn..
http://msdn.microsoft.com/en-us/library/system.reflection.fieldinfo.getvalue.aspx
Sería tan fácil como esto
FieldInfo myf = typeof(MyClass).GetField("val");
Console.WriteLine(myf.GetValue(null));
val = "hi";
En caso de no tener una clase estática deberíamos usar en lugar de null la instancia de esta clase.
Para obtener propiedades necesitaríamos exactamente el mismo código cambiando FieldInfo Por PropertyInfo:
PropertyInfo myf = typeof(MyClass).GetField("val");
Console.WriteLine(myf.GetValue(null,null));
val = "hi";
Para acabar os dejo una pequeña función que nos puede ayudar en varios escenarios:
public override string ToString()
{
StringBuilder sb = new StringBuilder();
foreach (MemberInfo mi in this.GetType().GetMembers())
{
if (mi.MemberType == MemberTypes.Field)
{
FieldInfo pi = mi as FieldInfo;
if (pi != null)
{
try
{
sb.AppendLine(pi.Name + ": " + pi.GetValue(this).ToString());
}
catch {
sb.AppendLine(pi.Name + ": null");
}
}
}
else if (mi.MemberType == MemberTypes.Property)
{
PropertyInfo pi = mi as PropertyInfo;
if (pi != null)
{
try
{
sb.AppendLine(pi.Name + ": " + pi.GetValue(this).ToString());
}
catch
{
sb.AppendLine(pi.Name + ": null");
}
}
}
}
return sb.ToString();
}