C # - создать EventHandler, который может принимать любое количество параметров - PullRequest
11 голосов
/ 22 октября 2010

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

Я знаю, что могу передать ему объект [], но мне хотелось бы что-то похожее на

MyEventHandler someCustomEvent(Object obj1, Object obj2, Object obj3)

, где количество объектов может быть 0 или 10, если необходимо.

EDIT:

Так что благодаря комментариям и ответам, которые я получил, я пришел к этому,

public class FinishedEventArgs : EventArgs {
            public Object[] Args{ get; set; }
        }

protected void OnFinished(params Object[] args) {
            if(this.Finished != null) {
                this.Finished(this, new FinishedEventArgs() {
                    Args = args
                });
            }
        }

Это выглядит приемлемо?

Ответы [ 3 ]

13 голосов
/ 22 октября 2010

EventHandler просто делегат.

Вы можете создать делегата следующим образом:

public delegate void Foo(params object[] args);

И событие:

public event Foo Bar;

Вы закончите с событием стрельбы, как это:

Bar(1, "");

Но, как сказал @Kent Boogaart, вы должны создавать события, используя EventHandler<TEventArgs>, поэтому лучшим подходом будет создание класса:

public class MyEventArgs : EventArgs
{
    public MyEventArgs(params object[] args)
    {
        Args = args;
    }

    public object[] Args { get; set; }
}

И событие:

public event EventHandler<MyEventArgs> Bar2;

Таким образом, вы будете запускать событие, как это:

Bar2(this, new MyEventArgs(1, ""));
6 голосов
/ 22 октября 2010

Вы можете определить делегата следующим образом:

public delegate void MyHandler(object p1, object p2, object p3);

и затем используйте его в определении вашего события:

public event MyHandler MyEvent;

Однако это противоречит передовым методам и не рекомендуется. Вместо этого вы должны инкапсулировать всю необходимую дополнительную информацию в свой собственный подкласс EventArgs и использовать ее от своего делегата:

public class MyEventArgs : EventArgs
{
    // any extra info you need can be defined as properties in this class
}

public event EventHandler<MyEventArgs> MyEvent;
1 голос
/ 22 октября 2010

Ничто не мешает вам объявить делегата, который принимает массив params, так же, как вы определяете любой другой метод, который принимает несколько аргументов:

delegate void someCustomEvent(params object[] args);

event someCustomEvent sce;

Однако это будет необычно.Как говорит Кент, более нормально следовать соглашению о платформе .Net, согласно которому обработчики событий принимают два аргумента: отправителя (объект) и аргументы события (EventArgs или что-то происходящее от него).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...