将属性作为参数传递给方法

时间:2011-07-10 09:31:33

标签: c#

我知道标题可能更具描述性/更好的措辞,但这是我能想到的最好的。

目前我的课程有很多方法,如下所示:

        private static void UpdateArtists()
        {
            artists.Clear();
            foreach (AudioInfo entry in library_entries)
            {
                artists.Add(entry.Artist, entry);
            }
        }

        private static void UpdateAlbums()
        {
            albums.Clear();
            foreach (AudioInfo entry in library_entries)
            {
                albums.Add(entry.Album, entry);
            }
        }

        private static void UpdateGenres()
        {
            genres.Clear();
            foreach (AudioInfo entry in library_entries)
            {
                genres.Add(entry.Genre, entry);
            }
        }

        private static void UpdateYears()
        {
            years.Clear();
            foreach (AudioInfo entry in library_entries)
            {
                years.Add(entry.Year, entry);
            }
        }

毋庸置疑,编写其中的数十篇非常令人厌烦。所以我想知道是否可以简化它并制作类似这样的方法:

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

这是可行的,如果是的话;如何?

谢谢!

1 个答案:

答案 0 :(得分:15)

如果你需要做这些事情,你的班级似乎有一些设计错误。 然而,解决方案是:

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

用法是:

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

此外,您可以使用更简单的方法,而不是调用您可以编写的任何方法:

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

如果您没有任何与您的词典相关联的活动。

还有一件事要做 - 你不能用相同的键添加不同的元素到字典。在您的情况下,您似乎有不同的AudioInfo个对象具有相同的YearGenre e.t.c。