Универсальный EventArgs В идти с универсальным делегатом EventHandler?


Есть .Объем 2.0 универсальный EventHandler в тип делегата, который может быть использован для определения события с точки зрения EventArgs в тип, который вы хотите использовать, не создавая избыточных тип делегата, чтобы использовать в случае декларации.

Ну, насчет EventArgs в? Я часто нахожу того, чтобы создать один-офф, производный от EventArgs в инкапсуляции дополнительных данных я хотел бы отправить. Почему это не может быть объявлен общим, а? Если все, что мне нужно передать строку или целое число, или точка, почему я должен создать StringEventArgs, IntEventArgs и/или PointEventArgs классу?

Я набросал две очень простые EventArgs в универсальные типы, как доказательство концепции:

public class ReadOnlyEventArgs<T>:EventArgs
{
    public T Parameter { get; private set; }

    public ReadOnlyEventArgs(T input)
    {
        Parameter = input;
    }
}

public class EventArgs<T>:EventArgs
{
    public T Parameter { get; set; }

    public EventArgs(T input)
    {
        Parameter = input;
    }
}

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

public event EventHandler<EventArgs<string>> StringValidationRequested;
public event EventHandler<ReadOnlyEventArgs<int>> RecordSelectedForRetrieval;
public event EventHandler<ReadOnlyEventArgs<Point>> MouseLocationReported;

Теперь, очевидно, это для более простых ситуаций, но я нашел большинство ситуаций мероприятие по сбору довольно просто. Единственно возможная вещь, которую я хотел бы добавить еще двух классов, производных от CancelEventArgs , чтобы добавить, что дополнительный функционал. Тот факт, что параметр может быть что угодно, в том числе класса делает ее достаточно гибкой, чтобы передавать сложные данные, и .Чистая 4-х кортежей заботиться о остальных ситуациях, когда вы не можете определить свой собственный сложный тип. Единственный недостаток я могу думать, не будучи в состоянии описательно наименование параметра; он универсален.



27483
17
задан 19 октября 2011 в 04:10 Источник Поделиться
Комментарии
2 ответа

Вы могли бы сделать его немного более полезным, если вы добавили некоторые вспомогательные методы фабрики для создания аргументов. Таким образом, вы не должны использовать конструктор и несколько неуклюжий синтаксис (необходимости указания типа).

public static class EventHandlerExtensions
{
public static EventArgs<T> CreateArgs<T>(
this EventHandler<EventArgs<T>> _,
T argument)
{
return new EventArgs<T>(argument);
}

public static ReadOnlyEventArgs<T> CreateArgs<T>(
this EventHandler<ReadOnlyEventArgs<T>> _,
T argument)
{
return new ReadOnlyEventArgs<T>(argument);
}
}

Затем создать экземпляр аргументы, вы могли бы просто сделать это:

public event EventHandler<EventArgs<SomeArg>> SomeEvent;
public event EventHandler<ReadOnlyEventArgs<SomeArg>> SomeOtherEvent;

protected virtual void OnSomeEvent(SomeArg argument)
{
var someEvent = SomeEvent;
if (someEvent != null)
{
var args = someEvent.CreateArgs(argument);
// instead of:
//var args = new EventArgs<SomeArg>(argument);
someEvent(this, args);
}
}

protected virtual void OnSomeOtherEvent(SomeArg argument)
{
var someOtherEvent = SomeOtherEvent;
if (someOtherEvent != null)
{
var args = someOtherEvent.CreateArgs(argument);
// instead of:
//var args = new ReadOnlyEventArgs<SomeArg>(argument);
someOtherEvent(this, args);
}
}

Это может быть полезно иметь варианты для нескольких параметров (аналогично тому, как кортеж). Хотя это может не быть возможным, чтобы иметь все комбинации нескольких (не)изменяемые аргументы.

8
ответ дан 19 октября 2011 в 05:10 Источник Поделиться

Вы реально понятия EventArgs в? Как по мне, EventArgs в это устаревшее понятие. Когда МС ввели родовые действий и делегаты func я с трудом могу вспомнить ситуацию, когда мне снова нужно использовать EventArgs в.

Насколько я понимаю, вы не ограничены данным .объем 2.0, потому что вы используете Кортеж. Так что если вы можете рассмотреть возможность использования действий и функций.

1
ответ дан 21 октября 2011 в 04:10 Источник Поделиться