2010-09-08 4 views
2

Я хотел знать, как получить значение свойства в C#, но это свойство имеет другой тип.C# Отражение на вложенных свойствах класса

public class Customer 
{ 
    public string Name {get; set;} 
    public string Lastname {get; set;} 
    public CustomerAddress Address {get; set;} 
} 

Так что я могу получить значения свойств Name и LastName, но я совершенно не понимаю, как получить значение CustomerAddress.City.

Это то, что я имею до сих пор.

public object GetPropertyValue(object obj, string property) 
{ 
    if (string.IsNullOrEmpty(property)) 
    return new object { }; 

    PropertyInfo propertyInfo = obj.GetType().GetProperty(property); 
    return propertyInfo.GetValue(obj, null); 
} 

Тогда этот метод используется в операторе LINQ.

var cells = (from m in model 
         select new 
         { 
          i = GetPropertyValue(m, key), 
          cell = from c in columns 
           select reflection.GetPropertyValue(m, c) 
        }).ToArray(); 

Таким образом, я не получаю никакой ценности для CustomerAddress.

Любая помощь будет глубоко оценена.

**** **** UPDATE

Вот как мне удалось это сделать.

public object GetNestedPropertyValue(object obj, string property) 
     { 
      if (string.IsNullOrEmpty(property)) 
       return string.Empty; 

      var propertyNames = property.Split('.'); 

      foreach (var p in propertyNames) 
      { 
       if (obj == null) 
        return string.Empty; 

       Type type = obj.GetType(); 
       PropertyInfo info = type.GetProperty(p); 
       if (info == null) 
        return string.Empty; 

       obj = info.GetValue(obj, null); 

      } 

      return obj; 
     } 
+0

Как насчет установки значения вложенного свойства? (То же, что и этот, но для info.SetValue ...)? – Denis

ответ

3

Во-первых, если вы хотите, чтобы получить значение CustomerAddress.City, вы никогда не получите его. CustomerAddress - это тип, а не название свойства. Вы хотите получить Address.City.

Сказали спасибо, что ваш GetPropertyValue не настроен для твоей работы.

разделите имя на точками:

var propertyNames = property.split('.');

Теперь у вас есть список имен свойств {"Address", "City"}

Затем, вы можете перебрать эти имена свойств, один за другим, вызывая GetPropertyValue рекурсивно.

Это должно сделать это :)

+0

Спасибо, что решил проблему, я не думал о рекурсии. –

0

@Michael -> перевернутая часть ;-)

public static void SetNestedPropertyValue(object obj, string property,object value) 
     { 
      if (obj == null) 
       throw new ArgumentNullException("obj"); 

      if (string.IsNullOrEmpty(property)) 
       throw new ArgumentNullException("property"); 

      var propertyNames = property.Split('.'); 

      foreach (var p in propertyNames) 
      { 

       Type type = obj.GetType(); 
       PropertyInfo info = type.GetProperty(p); 
       if (info != null) 
       { 
        info.SetValue(obj, value); 
        return; 
       } 

      } 

      throw new KeyNotFoundException("Nested property could not be found."); 
     } 
+0

Это совершенно бесполезно, у него даже нет простой Typeconversion. Также он не будет создавать новый экземпляр родительских объектов. На второй итерации в foreach будет отсутствовать ссылка. Это не работает вообще, только для строк и только если это НЕ сложный тип. –

Смежные вопросы