[.NET] Comment savoir si une List(Of T) a été modifiée ?

Je viens de remarquer que les List(Of T) ont un champ privé nommé _version qui est incrémenté à chaque fois que la liste est modifiée (Add, Insert, …). Cela peut s’avérer très pratique !

Néanmoins, pour l’utiliser, il n’y a pas d’autres possibilités que d’utiliser la réflection, ce qui ne fait pas très propre dans le code.

Il est cependant possible de se faciliter la vie avec les extensions. Voici le code que j’utilise :

<Code d’exemple>

Public Module ListVersionning
    Private Cache As New Dictionary(Of Type, 
System.Reflection.FieldInfo) <Runtime.CompilerServices.Extension()> _ Public Function VersionID(Of T)(ByVal This
As List(Of T))
As Integer Dim _version As System.Reflection.
FieldInfo =
Nothing Dim _type As Type = GetType(List(Of T)) If Not Cache.TryGetValue(_type, _version)
Then _version = _type.GetField("_version",
Reflection.BindingFlags.Instance +
Reflection.BindingFlags.GetField +
Reflection.BindingFlags.NonPublic) Cache.Add(_type, _version)
End If Return _version.GetValue(This) End Function <Runtime.CompilerServices.Extension()> _ Public Function HasBeenUpdatedSince(Of T)(
ByVal This As List(Of T), ByVal LastVersionID As
Integer
)
As Boolean Return LastVersionID = This.VersionID End Function End Module

</Code d’exemple>

PS : _version passe de Int32.MaxValue à Int32.MinValue si on tente une modification avec _version = Int32.MaxValue. Il est donc dangereux de faire des test >= pour savoir si la liste a été modifiée, ou des list.GetVersion()-LastKnownVersion pour savoir combien de modifications ont été faites depuis la dernière fois qu’on a lu la liste.

PS (2) : Les champs privés peuvent être renommés (théoriquement) à chaque version de DotNet. Il vaut donc mieux ne pas reposer dessus, surtout si vous voulez une application fonctionnelle sur plusieurs systèmes (DotNet CE, Mono, …) ==> A utiliser avec précaution !

Fremy

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Publié 31 octobre 08 10:45 par FREMYCOMPANY
Classé sous :

Commentaires

Pas de commentaires
Les commentaires anonymes sont désactivés

About FREMYCOMPANY

François REMY est un jeune développeur belge plein d'entrain qui traite surtout des technologies du web et de DotNet dans ses articles.


Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01




Search

Go

Ce blog

Abonnements