C # Отражение на вложенных свойствах класса - PullRequest
2 голосов
/ 08 сентября 2010

Я хотел знать, как я могу получить значение свойства в 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.

Любая помощь будет высоко оценена.

**** ОБНОВЛЕНИЕ ****

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

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

Ответы [ 2 ]

3 голосов
/ 08 сентября 2010

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

Тем не менее, ваш GetPropertyValue не настроен на то, что вы хотите.

Попробуйте разделить имя по точкам:

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

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

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

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

0 голосов
/ 28 августа 2015

@ Майкл -> перевернутая часть; -)

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.");
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...