Cómo obtener un valor de propiedad basado en el nombre

¿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 devuelva el valor de la propiedad. es decir:

 public string GetPropertyValue(string propertyName) { return the value of the property; } 

 return car.GetType().GetProperty(propertyName).GetValue(car, null); 

Deberías 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, podrías hacerlo 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"); 

Quieres Reflexión

 Type t = typeof(Car); PropertyInfo prop = t.GetProperty("Make"); if(null != prop) return prop.GetValue(this, null); 

Muestra simple (sin escribir el 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")); } 

Además, otros tipos responden, es fácil de obtener el valor de propiedad de cualquier objeto mediante el 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"); 

Ampliando la respuesta de Adam Rackis, podemos hacer que el método de extensión sea genérico simplemente así:

 public static TResult GetPropertyValue(this object t, string propertyName) { object val = t.GetType().GetProperties().Single(pi => pi.Name == propertyName).GetValue(t, null); return (TResult)val; } 

También puedes controlar el error si lo deseas.