在方法中将属性作为参数传递

5

我知道标题可能有点不太描述清楚/措辞不够好,但这是我能想到的最好的了。

目前我有一个类,其中有很多像下面这样的方法:

        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.
     }

那个可行吗?如果可以,怎么做呢?
谢谢!

请注意,您根本不需要使用ref关键字,因为类始终通过引用传递。 - Julien Lebosquain
嘿,你当然是对的。这就是你整夜坐着的结果。 - Heidenreich
可能是重复的问题:[如何将类的属性作为方法的参数传递?](https://dev59.com/sEjSa4cB1Zd3GeqPGpUZ) - nawfal
1个回答

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等属性。


1
你不必通过“ref”传递字典。 - Jalal Said
是的,你说得对,我只是从问题中复制了签名。 - oxilumin
实际上,我有一个自定义的OneToManyDictionary,它为每个键具有一个项目列表。如果我添加重复的键,则将该值添加到与该键关联的列表中。我想简化我的问题,只使用常规字典以避免更多不必要的混淆 :d。话虽如此,我想我会选择Func版本。谢谢! - Heidenreich
我真的很好奇这种情况下的设计错误是什么。我的代码真的可以从这样的批评中受益。错误是什么,应该如何修复? - kdbanman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接