Как получить значение свойства на основе имени

есть ли способ получить значение свойства объекта на основе его имени?

Например, если у меня есть:

public class Car : Vehicle { public string Make { get; set; } } 

а также

 var car = new Car { Make="Ford" }; 

Я хочу написать метод, в котором я могу передать имя свойства, и он вернет значение свойства. то есть:

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

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

Вы должны использовать reflection

 public object GetPropertyValue(object car, string propertyName) { return car.GetType().GetProperties() .Single(pi => pi.Name == propertyName) .GetValue(car, null); } 

Если вы хотите быть действительно фантазией, вы можете сделать это методом расширения:

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

А потом:

 string makeValue = (string)car.GetPropertyValue("Make"); 

Вы хотите Reflection

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

Простой пример (без жесткого кода записи отражения в клиенте)

 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")); } 

Кроме того, другие ребята отвечают, его легко получить значение свойства любого объекта с помощью метода расширения:

 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); } } 

Использование:

 Car foo = new Car(); var balbal = foo.GetPropertyValue("Make"); 

Расширяясь на ответе Адама Ракиса, мы можем сделать общий метод расширения просто следующим:

 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; } 

Вы можете бросить некоторую обработку ошибок вокруг этого, если хотите.

  • Как использовать reflection для вызова частного метода?
  • Как создать экземпляр произвольного типа массива во время выполнения?
  • Как получить имя переменной с помощью отражения?
  • C # Reflection - Получить значения полей из простого classа
  • Как получить class Array для данного classа в Java?
  • Почему отраженный доступ к защищенному / частному члену classа в C #?
  • используя objc_msgSend для вызова функции Objective C с именованными аргументами
  • Что может вызвать java.lang.reflect.InvocationTargetException?
  • Как получить значение свойства с помощью отражения
  • Разрешить тип от имени classа в другой сборке
  • Как вы получаете все свойства classа и его базовых classов (вверх по иерархии) с помощью Reflection? (С #)
  • Давайте будем гением компьютера.