Passer la propriété en tant que paramètre dans la méthode

Je sais que le titre pourrait probablement être un peu plus descriptif / mieux rédigé, mais c’est le meilleur que je puisse trouver.

Actuellement, j’ai une classe avec beaucoup de méthodes qui ressemblent à celles ci-dessous:

private static void UpdateArtists() { artists.Clear(); foreach (AudioInfo entry in library_ensortinges) { artists.Add(entry.Artist, entry); } } private static void UpdateAlbums() { albums.Clear(); foreach (AudioInfo entry in library_ensortinges) { albums.Add(entry.Album, entry); } } private static void UpdateGenres() { genres.Clear(); foreach (AudioInfo entry in library_ensortinges) { genres.Add(entry.Genre, entry); } } private static void UpdateYears() { years.Clear(); foreach (AudioInfo entry in library_ensortinges) { years.Add(entry.Year, entry); } } 

Inutile de dire que l’écriture de dizaines d’entre elles est très fastidieuse. Je me demandais donc s’il était possible de simplifier la méthode et de créer une méthode similaire à celle-ci:

  private static void Update(Dictionary dictionary, AudioInfo.Property property) { dictionary.Clear(); foreach (AudioInfo entry in library_ensortinges) { dictionary.Add(entry.property, entry); } //Where "property" is a property in the AudioInfo-class. } 

Est-ce faisable et si c’est le cas? Comment?

Merci!

Il semble que vous ayez des erreurs de conception dans votre classe si vous devez faire de telles choses. néanmoins, la solution est:

 private static void Update(Dictionary dictionary, Func func) { dictionary.Clear(); foreach (AudioInfo entry in library_ensortinges) { dictionary.Add(func(entry), entry); } } 

Et l’usage est:

 Update(years, x => x.Year); 

Aussi, vous pouvez utiliser un moyen plus simple, au lieu d’appeler des méthodes, vous pouvez simplement écrire:

 years = library_ensortinges.ToDictionary(x => x.Year, x => x); 

Si vous n’avez pas d’événements, liés avec votre dictionnaire.

Et une dernière chose à faire: vous ne pouvez pas append différents éléments avec les mêmes clés de dictionnaire. Dans votre cas, il semble que vous ayez différents objects AudioInfo avec les mêmes Year , Genre etc.