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