Вы можете написать:
EqualTo<T>(T value1, T value2) where T : IEquatable<T>
или больше и меньше:
Compare<T>(T value1, T value2) where T : IComparable<T>
Оба из них были бы довольно просты, учитывая IComparable<T>
и IEquatable<T>
:)
Вам потребуются отдельные перегрузки (или другие методы) для обработки последовательности таких значений:
SequenceEqualTo<T>(IEnumerable<T> sequence1, IEnumerable<T> sequence2)
where T : IEquatable<T>
SequenceCompare<T>(IEnumerable<T> sequence1, IEnumerable<T> sequence2)
where T : IComparable<T>
В качестве альтернативы, если вы не хотите использовать общее ограничение, вы можете использовать Comparer<T>.Default
и EqualityComparer<T>.Default
.
Если вы хотите обрабатывать последовательности в тех же методах, что и непоследовательности, вы всегда можете проверить, реализовано ли T
IEquatable<T>
и, если нет, реализовано ли IEnumerable<TElement>
для некоторых TElement
, в которых реализовано IEquatable<TElement>
, Заметьте, это будет довольно запутанно ...
РЕДАКТИРОВАТЬ: Хорошо, если вы собираетесь давать эти вещи динамически ...
Сначала выясните, являются ли они списками или нет. Вы захотите разобраться с этим отдельно. Предполагая, что это действительно List<T>
, вы можете сделать:
if (value1.GetType().IsGenericType &&
value1.GetType().GetGenericTypeDefinition() == typeof(List<>))
{
// Handle this case separately, definitely in another method.
// It'll be a pain.
}
В противном случае просто используйте обычный вызов Equals()
для проверки на равенство и приведите значение к неуниверсальному типу IComparable
для значения больше / меньше. Это не идеально, но должно работать ...