c# - 将扩展方法中的事件和函数分配为参数
问题描述
我有一个对象列表,我想在工厂方法中分配值。我检查了类似的问题,但他们可以访问现有程序集中的方法。我想使用自定义方法并定义应该设置哪个事件。
例如
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
}
解决方案
试图帮助了解 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());
}
}
推荐阅读
- android - Tensorflow-Lite:从 tf.Session 导出 GraphDef 转换失败
- sass - 如何根据高度将 CSS 应用于类的所有元素?
- javascript - 如何从 window.location.href 获取结果
- python - Python 3:无法使用 xmltodict 将 XML 转换为 dict
- excel - 复制列以生成唯一 ID
- laravel-blade - 如何显示具有绝对路径的图像,避免 laravel 添加基本 url?
- vue.js - Vue中的自动onLoad计数器
- php - 简单的 Html Dom:解析永无止境
- mysql - 连接两个表时如何修复 FROM 不正确的语法错误?
- java - Java Graphics2D 插值似乎不适用于调整大小的图像