在扩展方法中将事件和功能分配为参数

问题描述 投票:0回答:1

我有一个对象列表,我想在工厂方法中分配值。我已经检查过[[类似问题,但是他们可以访问现有程序集中的方法。我想使用自定义方法,还定义应设置的事件。

例如

mylist.Assign(nameofevent,assignfuntion);

用法类似

public static void Assign(this Control[] controls,eventhandler @event,Action func) { foreach (var item in controls) //assign function to event item.clicked += func;//Preferably clicked must be Specified from argument }

c# events extension-methods
1个回答
0
投票
[试图帮助探究Shervin Ivari问题的根本原因。我在说明如何实现它。但是仍然不确定这是否是您想要的吗?

public static void Main() { var listeners = new List<SomeClassWithListener> { new SomeClassWithListener(), new SomeClassWithListener(), new SomeClassWithListener() }; var theEvent = new SomeClassWithEvent(); MatchEmUp(listeners, theEvent); theEvent.RaiseEvent(); } public static void MatchEmUp(IEnumerable<SomeClassWithListener> listeners, SomeClassWithEvent theEvent) { foreach(SomeClassWithListener listener in listeners) theEvent.ItsAlive += listener.ThenIllSlayIt; } public class SomeClassWithListener { public void ThenIllSlayIt(object sender, EventArgs e) { Console.WriteLine("Chaaaaaarge!"); } } public class SomeClassWithEvent { public EventHandler ItsAlive; public void RaiseEvent() { ItsAlive.Invoke(this, new EventArgs()); } }

https://dotnetfiddle.net/4Y13cf

或者通过使用委托,EventHandler也是一个委托:

public static void Main() { var listener1 = new SomeClassWithListener(); var listener2 = new SomeClassWithListener(); var listener3 = new SomeClassWithListener(); var listeners = new List<EventHandler> { listener1.ThenIllSlayIt, listener2.ThenIllSlayIt, listener3.ThenIllSlayIt }; var theEvent = new SomeClassWithEvent(); MatchEmUp(listeners, theEvent); theEvent.RaiseEvent(); } public static void MatchEmUp(IEnumerable<EventHandler> listeners, SomeClassWithEvent theEvent) { foreach(EventHandler listener in listeners) theEvent.ItsAlive += listener; } public class SomeClassWithListener { public void ThenIllSlayIt(object sender, EventArgs e) { Console.WriteLine("Chaaaaaarge!"); } } public class SomeClassWithEvent { public EventHandler ItsAlive; public void RaiseEvent() { ItsAlive.Invoke(this, new EventArgs()); } }

https://dotnetfiddle.net/k16lsy
© www.soinside.com 2019 - 2024. All rights reserved.