¿Hay alguna forma de obtener el valor de una propiedad de un objeto en función de su nombre?
Por ejemplo si tengo:
public class Car : Vehicle
{
public string Make { get; set; }
}
y
var car = new Car { Make="Ford" };
Quiero escribir un método donde pueda pasar el nombre de la propiedad y devolvería el valor de la propiedad. es decir:
public string GetPropertyValue(string propertyName)
{
return the value of the property;
}
c#
asp.net
reflection
Codificador 2
fuente
fuente
Tendrías que usar la reflexión
public object GetPropertyValue(object car, string propertyName) { return car.GetType().GetProperties() .Single(pi => pi.Name == propertyName) .GetValue(car, null); }
Si quieres ser realmente elegante, puedes convertirlo en un método de extensión:
public static object GetPropertyValue(this object car, string propertyName) { return car.GetType().GetProperties() .Single(pi => pi.Name == propertyName) .GetValue(car, null); }
Y entonces:
string makeValue = (string)car.GetPropertyValue("Make");
fuente
car
Quieres reflejo
Type t = typeof(Car); PropertyInfo prop = t.GetProperty("Make"); if(null != prop) return prop.GetValue(this, null);
fuente
Muestra simple (sin escribir código duro de reflexión en el cliente)
class Customer { public string CustomerName { get; set; } public string Address { get; set; } // approach here public string GetPropertyValue(string propertyName) { try { return this.GetType().GetProperty(propertyName).GetValue(this, null) as string; } catch { return null; } } } //use sample static void Main(string[] args) { var customer = new Customer { CustomerName = "Harvey Triana", Address = "Something..." }; Console.WriteLine(customer.GetPropertyValue("CustomerName")); }
fuente
Además, otros chicos responden, es fácil obtener el valor de propiedad de cualquier objeto mediante el uso del método de extensión como:
public static class Helper { public static object GetPropertyValue(this object T, string PropName) { return T.GetType().GetProperty(PropName) == null ? null : T.GetType().GetProperty(PropName).GetValue(T, null); } }
El uso es:
Car foo = new Car(); var balbal = foo.GetPropertyValue("Make");
fuente
return T.GetType().GetProperty(PropName)?.GetValue(T, null);
Ampliando la respuesta de Adam Rackis, podemos hacer que el método de extensión sea genérico simplemente así:
public static TResult GetPropertyValue<TResult>(this object t, string propertyName) { object val = t.GetType().GetProperties().Single(pi => pi.Name == propertyName).GetValue(t, null); return (TResult)val; }
También puede lanzar un poco de manejo de errores si lo desea.
fuente
Para evitar la reflexión, puede configurar un diccionario con sus nombres de propiedad como teclas y funciones en la parte de valor del diccionario que devuelven los valores correspondientes de las propiedades que solicita.
fuente