2011-07-10 9 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-a-a-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); 

イベントがない場合は、辞書にリンクしてください。

さらにもう1つのこと - 同じキーを持つ別の要素を辞書に追加することはできません。あなたのケースでは、同じYearGenre e.t.cを持つ異なるAudioInfoオブジェクトを持っているようです。

+1

辞書を 'ref'で渡す必要はありません。 –

+0

はい、あなたが正しいです、私はちょうど質問から署名をコピーしました。 – oxilumin

+0

実際には、各キーの項目のリストを持つカスタムOneToManyDictionaryがあります。重複キーを追加すると、キーに関連付けられたリストに値が追加されます。私は私の質問を単純化し、必要以上に混乱を避けるために正規の辞書を使用すると思った。つまり、私はFuncのバージョンに行くと思います。ありがとう! – Heidenreich

関連する問題