C# - Общий метод для аудита объектов с вложенными сложными свойствами, такими как list и iEnumeable

Я пытаюсь создать универсальный метод, который принимает два объекта в качестве параметров и сравнивает каждое свойство в объектах и ​​возвращает различия. Теперь я реализую это с помощью отражения, и это прекрасно работает для простых свойств (int, string....).

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

В каждом цикле его дает мне newItem и OldItem типа объекта. Не в состоянии выполнять другие операции.

Мне нужно какое-то решение, чтобы найти добавленные и удаленные элементы из свойств типа IEnumerable.

Любые предложения для продолжения приветствуются.

Спасибо!!

 private static string GenerateAuditLogMessage<T>(T oldObject, T newObject)
    {
        PropertyInfo[] properties = typeof(T).GetProperties();
        foreach (PropertyInfo pi in properties)
        {
            object oldValue = pi.GetValue(oldObject), newValue = pi.GetValue(newObject);

            if (pi.PropertyType.IsGenericType && typeof(IEnumerable).IsAssignableFrom(pi.PropertyType))
            {
                Type type = oldValue.GetType().GetGenericArguments()[0];
                foreach (var oldItem in (IEnumerable)oldValue)
                {
                    foreach (var newItem in (IEnumerable)newValue)
                    {
                        var propertyResult = GenerateAuditLogMessage<object>(oldObject, newObject);
                        if (string.IsNullOrEmpty(propertyResult))
                        {
                            // newItem. 
                        }
                    }
                }
                /* Need something like below commented line.*/
                // var added = newValue.Except(oldValue)
                // var removed = oldValue.Except(newValue);
            }
            else
            {
                if (!object.Equals(oldValue, newValue))
                {
                    //....
                }
            }
        }

        return string.Empty;
    }

1 ответ

Это одно старое пре-родовое System.Collections.* интерфейсы все еще используются для: использования отражения в общих коллекциях.

Вы можете разыграть любой общий System.Collections.Generic.IEnumerable<T> в System.Collections.IEnumerable, любой System.Collections.Generic.IList<T> в System.Collections.IListи т. д. Затем вы можете просматривать их любым способом, который они поддерживают.

Ты уже звонишь o.GetType().GetGenericArguments() чтобы убедиться, что они являются коллекциями одного типа, и если они есть, вы можете получить объекты в коллекциях через неуниверсальные интерфейсы коллекций. Раз уж у вас есть предметы, конечно, просто вернитесь.

Другие вопросы по тегам