Итерация рекурсивно по свойствам объекта - PullRequest
3 голосов
/ 25 октября 2010

Я хочу получить все свойства объекта во время выполнения и сохранить его в базе данных вместе с его значениями.Я делаю это рекурсивно, т. Е. Всякий раз, когда свойство также находится на объекте, я вызываю тот же метод и передаю свойство как параметр.

См. Мой код ниже:

private void SaveProperties(object entity) {

    PropertyInfo[] propertyInfos = GetAllProperties(entity);
    Array.Sort(propertyInfos,
                delegate(PropertyInfo propertyInfo1, PropertyInfo propertyInfo2)
                { return propertyInfo1.Name.CompareTo(propertyInfo2.Name); });

    _CurrentType = entity.GetType().Name;

    foreach (PropertyInfo propertyInfo in propertyInfos) {
        if (propertyInfo.GetValue(entity, null) != null) {
            if (propertyInfo.PropertyType.BaseType != typeof(BaseEntity)) {
                SaveProperty((BaseEntity)entity, propertyInfo);
            }
            else {
                // **here**
                SaveProperties(Activator.CreateInstance(propertyInfo.PropertyType));
            }
        }
    }
}

ОднакоПроблема с моим текущим кодом заключается в том, что я создаю новый экземпляр для объектов свойств (см. Выделение), таким образом теряя все данные, которые были на исходном объекте.Как я могу рекурсивно перебрать все свойства объекта?Возможно ли это?

Пожалуйста, помогите.Заранее спасибо.

1 Ответ

5 голосов
/ 25 октября 2010

Используйте это вместо того, чтобы заменить выделенную строку:

SaveProperties (propertyInfo.GetValue (entity, null));

Я бы также сделал что-то подобное, чтобы убедиться, что GetValue() применимо и чтобы избежать множественных вызовов к нему:

object v = propertyInfo.CanRead ?  propertyInfo.GetValue (entity, null) : null;
if (v != null) {
   if (...) {
   } else {
      SaveProperties (v);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...