2011-07-10 34 views
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. 
    } 

那是可行的,如果是,怎么样?

谢谢!

+0

请注意,根本不需要'ref',类总是通过引用传递。 –

+0

嘿,你当然是对的。这就是你整晚坐下时所得到的。 – Heidenreich

+0

可能重复[如何传递一个类的属性作为方法的参数?](http://stackoverflow.com/questions/1178574/how-can-i-pass-a-property-of-a -class-as-a-a-parameter-of-method) – nawfal

回答

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.相同。

+1

你不必通过'ref'来传递字典。 –

+0

是的,你是对的,我刚刚从问题中复制了签名。 – oxilumin

+0

其实我有一个自定义OneToManyDictionary,它有每个键的项目列表。如果我添加一个重复密钥,它会将该值添加到与密钥关联的列表中。以为我会简化我的问题,只是使用常规字典来避免比所需更多的困惑:d。这就是说,猜我会去与Func版本。谢谢! – Heidenreich