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()
чтобы убедиться, что они являются коллекциями одного типа, и если они есть, вы можете получить объекты в коллекциях через неуниверсальные интерфейсы коллекций. Раз уж у вас есть предметы, конечно, просто вернитесь.