2015-12-13 70 views
1

一行鑑於多種方法:訂閱的代碼

btn1.MouseDown += someMethod1; 
btn1.MouseDown += someMethod2; 
btn1.MouseDown += someMethod3; 

我如何定義一個適當的結構允許這樣的:

btn1.MouseDown += someMethods; 

回答

3

您可以使用Delegate.Combine創建一個委託。像這樣的東西(可能有不同的委託類型):

EventHandler handler = (EventHandler)Delegate.Combine((EventHandler)someMethod1, 
                 (EventHandler)someMethod2, 
                 (EventHandler)someMethod3); 
SomeEvent += handler; 
+0

工作完美。謝謝。 – NWoodsman

0

通常做的將是一回事,有集合方法,並超過他們迭代:

foreach (var f in new EventHandler[]{someMethod1, someMethod2, someMethod3}) 
{ 
    btn1.MouseDown += f; 
} 

這也可以變成使用List.ForAll()如果你想有一個單行使用它而不是foreach

1

這可能只是做一個平凡的方式,但你可以這樣做:

EventHandler someMethods = someMethod1; 

someMethods += someMethod2; 
someMethods += someMethod3; 

btn1.MouseDown += someMethods; 
1

您可以使用delegate.combine或只是使用'+'運算符鏈接多個代表。

btn1.MouseDown = new EventHandler(Method1) + new EventHandler(Method2) + new EventHandler(Method3) + ...; 

兩者基本相同。

+2

巧妙的把戲。看起來好像你只是將第一個投入爲EventHandler,其餘的將自動投射:'btn1.MouseDown + =(EventHandler)someMethod1 + someMethod2 + someMethod3;' – StriplingWarrior