Я борюсь с реализацией интерфейса IEquatable<>
для класса. Класс имеет свойство Parameter
, которое использует тип generi c. По сути, определение класса выглядит следующим образом:
public class MyClass<T> : IEquatable<MyClass<T>>
{
public T Parameter { get; }
...
}
В методе Equals()
я использую EqualityComparer<T>.Default.Equals(Parameter, other.Parameter)
для сравнения свойства. Как правило, это работает нормально - если свойство не является коллекцией, например IEnumerable<T>
. Проблема заключается в том, что средство сравнения по умолчанию для IEnumerable<T>
проверяет равенство ссылок.
Очевидно, что вы захотите использовать SequenceEqual()
для сравнения IEnumerable<T>
. Но чтобы это запустить, вам нужно указать тип c generi для метода SequenceEqual()
. Это самое близкое, что я мог получить:
var parameterType = typeof(T);
var enumerableType = parameterType.GetInterfaces()
.Where(type => type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>))
.Select(type => type.GetGenericArguments().First()).FirstOrDefault();
if (enumerableType != null)
{
var castedThis = Convert.ChangeType(Parameter, enumerableType);
var castedOther = Convert.ChangeType(other.Parameter, enumerableType);
var isEqual = castedThis.SequenceEqual(castedOther);
}
Но это не работает, потому что Convert.ChangeType()
возвращает object
. И, конечно, object
не реализует SequenceEqual()
.
Как мне заставить это работать? Спасибо за любые советы!
С уважением, Оливер