Если вы хотите использовать отражение, у класса List<T>
есть приватное поле с именем _version
, которое увеличивается каждый раз при изменении списка. Он не скажет вам, какие элементы были изменены, но вы можете сравнить его с исходным значением _version
, чтобы обнаружить неизмененный список.
Для справки, это поле используется, чтобы гарантировать, что перечислители станут недействительными при изменении списка. Таким образом, вы должны иметь возможность использовать его в своих целях достаточно надежно, если только фактический управляемый код для List<T>
не изменится.
Чтобы получить значение _version
, вы можете использовать что-то вроде этого:
List<T> myList;
var field = myList.GetType().GetField("_version", BindingFlags.Instance | BindingFlags.NonPublic);
int version = field.GetValue(myList);
В целом, однако, это не лучший подход. Однако, если вы застряли, используя List<T>
, созданный кем-то другим, это, вероятно, лучший вариант, который у вас есть. Имейте в виду, что изменения в .NET Framework могут изменить имя поля (или полностью его удалить), и он не гарантированно существует в сторонних реализациях CLR, таких как Mono.