Получить значение свойства второго уровня, используя отражение

1

Я написал метод расширения, который получает значение свойства для объекта. Это тот код:

public static string GetValueFromProperty(this object obj, string Name)
{
    var prop = obj.GetType().GetProperty(Name);
    var propValue = prop != null ? (string)prop.GetValue(obj, null) : string.Empty;
    return propValue;
}

Он отлично работает с свойствами первого уровня. Теперь у меня есть проблема. Я хочу получить выделенный текст выпадающего списка, и я называю это метосом следующим образом:

string s = drp.GetValueFromProperty("SelectedItem.Text");

но он ничего не возвращает.

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

благодаря

Теги:
reflection
c#-4.0
extension-methods

2 ответа

3
Лучший ответ

Вы пытаетесь найти свойство с именем SelectedItem.Text, но это свойство не существует на данном объекте (и никогда не будет, . Зарезервированное символ, который не может появиться в имени свойства)

Вы можете проанализировать свой ввод, разделив каждый метод на . , и цепочка ваших звонков один за другим:

public static string GetValueFromProperty(this object obj, string Name)
{
  var methods = Name.Split('.');

  object current = obj;
  object result = null;
  foreach(var method in methods)
  {
    var prop = current.GetType().GetProperty(method);
    result = prop != null ? prop.GetValue(current, null) : null;
    current = result;
  }
  return result == null ? string.Empty : result.ToString();
}

Живой пример здесь.

Редактировать:

Метод обратного сеттера выглядел бы очень похожим (я сделал его общим по типу свойства, которое нужно установить):

public static void SetValueFromProperty<T>(this object obj, string Name, T value)
{
  var methods = Name.Split('.');

  object current = obj;
  object result = null;
  PropertyInfo prop = null;
  for(int i = 0 ; i < methods.Length - 1  ; ++i)
  {
    var method = methods[i];
    prop = current.GetType().GetProperty(method);
    result = prop != null ? prop.GetValue(current, null) : null;
    current = result;
  }

  if(methods.Length > 0)
    prop = current.GetType().GetProperty(methods[methods.Length - 1]);
  if(null != prop)
      prop.SetValue(current, value, null);
}
  • 0
    Спасибо, все работает нормально. Можете ли вы добавить код для Set Value для этих свойств? Спасибо
  • 0
    Отредактировано с помощью Setter. Обратите внимание, что я не проверяю, соответствует ли переданная строка.
1

Быстрый код (перемещение по дереву):

public static string GetValueFromProperty(this object obj, string Name)
{
    string[] names = Name.Split('.');
    object currentObj = obj;
    string value = null;
    for (int i = 0; i < names.Length; i++)
    {
        string name = names[i];
        PropertyInfo prop = currentObj.GetType().GetProperty(name);
        if (prop == null)
            break;
        object propValue = prop.GetValue(currentObj, null);
        if (propValue == null)
            break;
        if (i == names.Length - 1)
            value = (string)propValue;
        else
            currentObj = propValue;
    }
    return value ?? string.Empty;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню