2010-07-26 82 views
4

我想創建一個方法是這樣的:C#委託詞典添加

private static void AddOrAppend<K>(this Dictionary<K, MulticastDelegate> firstList, K key, MulticastDelegate newFunc) 
{ 
    if (!firstList.ContainsKey(key)) 
    { 
     firstList.Add(key, newFunc); 
    } 
    else 
    { 
     firstList[key] += newFunc; // this line fails 
    } 
} 

但這種失敗,因爲它說,你不能添加多路廣播委託。有什麼我失蹤?我認爲委託關鍵字只是從MulticastDelegate繼承的類的簡寫。

+0

或者你可以在.NET 4.0中使用'ConcurrentDictionary' ... – 2010-07-26 19:52:54

+1

@Steven - 我不知道這是怎麼解決的問題? – 2010-07-26 20:01:25

+1

@Marc:這不是問題的解決方案,它是通過不重新發明輪子完全避免它的一種方法。具體來說,他試圖創建的功能類型已經可用:http://msdn.microsoft.com/en-us/library/ee378675.aspx – 2010-07-26 20:29:16

回答

8
firstList[key] = (MulticastDelegate)Delegate.Combine(firstList[key],newFunc); 

與測試:

 var data = new Dictionary<int, MulticastDelegate>(); 

     Action action1 =() => Console.WriteLine("abc"); 
     Action action2 =() => Console.WriteLine("def"); 
     data.AddOrAppend(1, action1); 
     data.AddOrAppend(1, action2); 
     data[1].DynamicInvoke(); 

(工作)

但TBH,只是代替MulticastDelegate使用Delegate;這在很大程度上是從未真正起作用的東西的宿醉。或更好;代表的具體類型(或許Action)。

+0

謝謝!這回答了我的問題,但是你知道我的代碼爲什麼不起作用嗎? – Xodarap 2010-07-26 22:55:53