Хотя здесь невозможно использовать SequenceEqual
, это будет включать либо dynamic
, как в ответе Джаспера Кента, либо довольно много кода для размышления, я обрисую, что вам нужно сделать, если бы вы используя отражение:
- проверьте, являются ли оба объекта
IEnumerable<T>
. - , получите
Type
обоих объектов, а затем получите параметр типа T
как Type
а также - получить метод
SequenceEquals
из Enumerable
как MethodInfo
. Это включает использование LINQ для поиска перегрузки с двумя параметрами. - вызов
MakeGenericMethod
с T
. Invoke
MethodInfo
I Я не хотел бы читать или писать этот код ... Использование dynamic
хорошо, я думаю, хотя некоторые люди имеют разные мнения ...
Так что вот третий способ: я предлагаю вам написать свой собственный SequenceEqual
метод, который занимает IEnumerable
с (не универсальная c версия):
private static bool SequenceEqual(IEnumerable first, IEnumerable second) {
IEnumerator e1 = first.GetEnumerator();
IEnumerator e2 = second.GetEnumerator();
try {
// adapted from https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,63644a881e976b52,references
while (e1.MoveNext())
{
if (!(e2.MoveNext() && e1.Current.Equals(e2.Current))) return false;
}
if (e2.MoveNext()) return false;
return true;
} finally {
if (e1 is IDisposable d1) {
d1.Dispose();
}
if (e2 is IDisposable d2) {
d2.Dispose();
}
}
}
Тогда вы можете просто проверить, являются ли объекты IEnumerable
:
if (v.Original is Enumerable e1 &&
v.Current is Enumerable e2 &&
!SequenceEqual(e1, e2))
{
variances.Add(v);
}