私はこれまでに思い付いた最も複雑なタイトルです。 私はそれをよりよく説明する方法がわかりませんが、この例の短さ:単一のメソッドから複数の文字列への辞書のマッピング単一の文字列から複数のメソッドへの辞書
私はタイプがあります。このタイプでは、さまざまなメソッドが用意されています。これらのメソッドには、OnAttribute属性が1つ以上付けられており、それぞれがこのメソッドが起動する必要のあるイベント名を定義します。私は現在、このクエリでイベント名のその関連リストにメソッドの辞書を取得しています:
var methods = this.GetType().GetMethods()
.Where(m => Attribute.IsDefined(m, typeof(OnAttribute)))
.ToDictionary(m => m,
m => m.GetCustomAttributes(typeof(OnAttribute), true)
.Select(a => ((OnAttribute)a).EventName)); //OnAttribute defines an EventName field
結果の型がIEnumerable<IGrouping<System.Reflection.MethodInfo,IEnumerable<string>>>
です。しかし、リクエストされたイベントのメソッドに署名するためには、各イベント名を実行するよう要求するすべてのメソッドに、各イベント名をマップする必要があります。言い換えれば、前述のタイプがIEnumerable<IGrouping<string,IEnumerable<System.Reflection.MethodInfo>>>
にマッピングされている必要があります。
私はこの必要があります:私は確信している
"Event_1" => [Method_1,Method_2]
"Event_2" => [Method_1,Method_3]
"Event_3" => [Method_2]
"Event_4" => [Method_1]
:私の現在のコードを使用して、
[On("Event_1")]
[On("Event_2")]
[On("Event_4")]
void Method_1()
{
...
}
[On("Event_1")]
void Method_2()
{
...
}
[On("Event_2")]
[On("Event_3")]
void Method_3()
{
...
}
、これにマッピングします:
代わりにこれにマッピングされMethod_1 => ["Event_1","Event_2","Event_4"]
Method_2 => ["Event_1"]
Method_3 => ["Event_2","Event_3"]
をこれを記述するために、そこにいくつかのより良い専門用語があります。私はそれが何であるか分かりません。
私はforeachループを使用して醜い方法で辞書を作成しようとしましたが、私が言ったように、それは実際に uglyです。また、SelectMany()をいくつかの匿名型とともに使用して、辞書をリストにまとめてから、GroupByを使用してそのリストを自分の望む辞書に再グループ化しようとしましたが、それは非効率的で面倒です。私はこれを行う(最高)LINQの方法を知りたいです。
私はそれが少なくともちょっとした感覚で作られたことを願っています。
ありがとうございました!
私はいくつかのベンチマークを実行し、 'new KeyValuePair(EventName、MethodInfo)'を使うことは、 'new {EventName、MethodInfo}'(匿名のtyペス) –