c# - 将扩展方法中的事件和函数分配为参数

标签 c# events extension-methods

我有一个对象列表,我想在工厂方法中分配值。我检查了类似问题 但他们可以访问 中的方法现有组件 .我想使用自定义方法并定义应该设置哪个事件。

例如

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

或者通过使用委托(delegate),EventHandler 也是一个委托(delegate):
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

关于c# - 将扩展方法中的事件和函数分配为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61357837/

相关文章:

c# - 插入语句组合逻辑

c# - 直接更改TextAreafor上的日期显示格式

javascript - 从子元素进入父元素时不触发 MouseEnter 事件

c# - 需要解释使用 lambda 作为事件处理程序

C# Count() 扩展方法性能

objective-c - Swift 扩展 - 将 Json 解析为 NSDictionary 模型(通过使用类似于 Obj-C 中的类别)

c# - 如何将彩色图像转换为仅具有两种预定义颜色的图像?

c# - 用括号外的逗号拆分值?

java - 另一个 Java 事件问题

c# - 在 C# 中操作密封类型