首页 > 解决方案 > 将扩展方法中的事件和函数分配为参数

问题描述

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

例如

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#eventsextension-methods

解决方案


试图帮助了解 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


推荐阅读