Назначить событие и функцию в методе расширения в качестве аргумента - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть список объектов, и я хочу присвоить значения в заводском методе. Я проверил подобные вопросы , но у них есть доступ к методу существующей сборки . Я хочу использовать пользовательский метод, а также определить, какое событие должно быть установлено.

например

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
}

1 Ответ

0 голосов
/ 22 апреля 2020

Попытка помочь разобраться в том, что не так с вопросом Шервина Ивари. Я иллюстрирую, как вы можете этого достичь. Но все еще не уверены, хотите ли вы этого?

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

...