Este artículo ha sido evaluado por expertos para asegurar la veracidad de este artículo.
Solución:
Uso el siguiente método para obtener los valores de propiedades (clases anidadas) como
“Propiedad”
“Nombre de la calle”
“Dirección.País.Nombre”
public static object GetPropertyValue(object src, string propName)
if (src == null) throw new ArgumentException("Value cannot be null.", "src");
if (propName == null) throw new ArgumentException("Value cannot be null.", "propName");
if(propName.Contains("."))//complex type nested
var temp = propName.Split(new char[] '.' , 2);
return GetPropertyValue(GetPropertyValue(src, temp[0]), temp[1]);
else
var prop = src.GetType().GetProperty(propName);
return prop != null ? prop.GetValue(src, null) : null;
Aquí está el violín: https://dotnetfiddle.net/PvKRH0
Sé que llego un poco tarde a la fiesta, y como dijeron otros, tu implementacion esta bien
…para casos de uso simples.
Sin embargo, he desarrollado una biblioteca que resuelve exactamente ese caso de uso, Pather.CSharp.
También está disponible como paquete Nuget.
Su clase principal es Resolver
con su Resolve
método.
le pasas un objeto y los ruta de propiedady devolverá el valor deseado.
Invoice inv = GetDesiredInvoice(); // magic method to get an invoice
var resolver = new Resolver();
object result = resolver.Resolve(inv, "BillTo.Address");
Pero también puede resolver más rutas de propiedades complejasincluyendo array y acceso al diccionario.
Entonces, por ejemplo, si su Customer
tenido varias direcciones
public class Customer
public String Name get; set;
public IEnumerable Addresses get; set;
puedes acceder al segundo usando Addresses[1]
.
Invoice inv = GetDesiredInvoice(); // magic method to get an invoice
var resolver = new Resolver();
object result = resolver.Resolve(inv, "BillTo.Addresses[1]");
De hecho, creo que tu lógica está bien. Personalmente, probablemente lo cambiaría para que pase el objeto como el primer parámetro (que está más en línea con PropertyInfo.GetValue, por lo que es menos sorprendente).
Probablemente también lo llamaría algo más como GetNestedPropertyValue, para que sea obvio que busca en la pila de propiedades.
Acuérdate de que tienes autorización de reseñar si te fue útil.