Я пытаюсь обобщить дублирующую функцию проверки, которая в зависимости от того, какой тип объекта проверяет свойства, указанные в классе (предоставленные в конфигурации), равны свойствам в другом списке.
Я решил создать словарь, который будет принимать строку типа для ключа (книга, автор, магазин и т. Д.) И массив свойств, которые должны быть равны.
Пример словаря enties:
"Book", ["Title", "CoverImage", "NumberOfPages"]
"Author", ["Name", "Address", "SomethingElse"]
Затем я передаю объект функции и использую Reflection, чтобы получить имя типа ...
obj.GetType().Name;
... которое язатем используйте для получения правильного KVP из Словаря, что означает, что если я передам объект Book, я получу «Book».Затем мы используем это, чтобы получить конфигурацию через ...
configDictionary["obj.GetType().Name"]
..., которая дает нам массив строк, которые являются свойствами, с которыми нам нужно проверить равенство.
Iя попал в ту часть, где мне нужно что-то вроде
list.Where(x => --> for each of the strings in the array - x.GetType.GetProperty(string) && --> same for next string && same for next string
... и затем мне нужно завершить это ...
x.Id != obj.Id
убедитесь, что мы проверяем дубликаты на основе нашей логики (разные идентификаторы и совпадения во всех свойствах, но при этом имеют разные идентификаторы - дубликат).
Конечный запрос должен выглядеть следующим образом:
Books:
someList.Where(x =>
x.Title == obj.Title
&& x.CoverImage == obj.CoverImage
&& x.NumberOfPages == obj.NumberOfPages
&& x.Id != obj.Id)
.FirstOrDefault();
Авторы:
someList.Where(x => x.Name == obj.Name
&& x.Address == obj.Address
&& x.SomethingElse == obj.SomethingElse
&& x.Id != obj.Id)FirstOrDefault();