Як отримати значення властивості на основі імені


147

чи є спосіб отримати значення властивості об’єкта на основі його імені?

Наприклад, якщо у мене є:

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

Відповіді:


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

17
Майте на увазі, що оскільки для цього використовується рефлексія, це набагато повільніше. Напевно, це не проблема, але добре пам’ятати.
Метт Грір

"Неможливо перетворити з String в BindingFlags"
Крістін

5
Чи існує "швидший" спосіб @MattGreer?
FizxMike

44

Вам доведеться використовувати роздуми

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

Ви хочете отримати GetValue замість SetValue
Метт Грір

чи можу я це зробити також для SetValue? як?
П'єро Альберто

1
Метод розширення дрібних речей, напевно, не повинен мати змінну з назвоюcar
KyleMit

Щоб дізнатися, як встановити значення властивості на основі рядка propertyName, дивіться відповідь тут: Встановлення значення властивостей за допомогою відображення
nwsmith

35

Ви хочете Рефлексія

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

7
+1 Це найкраща відповідь, коли ви показуєте всі проміжні об’єкти
Метт Грір,

1
Замість того, щоб передати значення властивості, чи можу я передати індекс та отримати ім’я та значення властивості (тож я можу переглядати всю власність)?
singhswat

@singhswat Вам слід задати це як нове запитання.
Чак Савідж

7

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

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

7

Крім того, інші хлопці відповідають, його легко отримати значення властивості будь-якого об'єкта за допомогою методу Extension, наприклад:

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

7

Розкриваючи відповідь Адама Ракіса - ми можемо зробити метод розширення загальним просто таким чином:

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

Якщо ви хочете, ви також можете вирішити цю помилку.


1

Щоб уникнути роздумів, ви можете встановити Словник із власними іменами як ключі та функції в частині значення словника, які повертають відповідні значення з властивостей, які ви запитуєте.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.