Saltar al contenido

Uso de la reflexión en C# para obtener propiedades de un objeto anidado

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *