2010-07-26 73 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