Это не цель универсальных методов.Если вы пишете метод с подписью:
public Dictionary<T, List<T>> CheckDuplicates<T>(T something)
, вы определяете «разделяемую логику».Это означает, что одна и та же логика должна работать для каждого T
, переданного методу.Если это не так, вы должны ограничить T
, используя какое-то ограничение:
public Dictionary<T, List<T>> CheckDuplicates<T>(T something) where T : ISomeInterface
Теперь вы знаете, что каждый T
, переданный методу, должен реализовывать ISomeInterface
, и вы можете использовать вВ вашем методе любое свойство или метод, объявленный в этом интерфейсе.
Содержимое метода не должно быть разным для различных типов T
, но логика может, потому что вы можете вызывать методы и свойства T
s, которые могутимеют различную реализацию.Если этого недостаточно, вы можете передать другой параметр - универсальный делегат или некоторый другой универсальный класс, основанный на T
, который добавит вам дополнительную логику.
В вашем сценарии вы хотите сравнивать каждый переданный класс по-разному => сравнение не может быть частью вашего метода, но оно должно быть либо частью ваших сущностей, либо вы должны передать дополнительный класс / метод, который будет выполнять сравнение дляметод.
Для реализации сравнения непосредственно в ваших классах вы можете реализовать интерфейс IComparable<T>
и объявить свой метод следующим образом:
public Dictionary<T, List<T>> CheckDuplicates<T>(T something) where T : IComparable<T>
Для реализации сравнения вне ваших классов вы можете просто использовать Func<T, T, int>
илиреализация IComparer<T>
:
public Dictionary<T, List<T>> CheckDuplicates<T>(T something, IComparer<T> comparer)
В любом случае я не уверен, как это связано с структурой сущностей, поскольку сигнатура вашего метода не имеет ничего общего с EF.