Вопрос

Я готовлюсь создать универсальный класс EventArgs для аргументов событий, которые содержат один аргумент:

public class EventArg<T> : EventArgs
{
    // Property variable
    private readonly T p_EventData;

    // Constructor
    public EventArg(T data)
    {
        p_EventData = data;
    }

    // Property for EventArgs argument
    public T Data
    {
        get { return p_EventData; }
    }
}

Прежде чем я это сделаю, есть ли в C# такая же функция, встроенная в язык?Кажется, я припоминаю, что сталкивался с чем-то подобным, когда вышел C# 2.0, но сейчас я не могу этого найти.

Или, другими словами, должен ли я создавать свой собственный универсальный класс EventArgs, или C# предоставляет его?Спасибо за вашу помощь.

Это было полезно?

Решение

Нет.Вы, вероятно, думали о EventHandler<T>, который позволяет вам определить делегат для любого конкретного типа EventArgs.

Лично я этого не чувствую EventArgs<T> впрочем, он так же хорошо подходит.Информация, используемая в качестве "полезной нагрузки" в аргументах события, должна быть, на мой взгляд, пользовательским классом, чтобы сделать его использование и ожидаемые свойства очень понятными.Использование универсального класса лишит вас возможности расставлять значимые имена по местам.(Что представляют собой "Данные"?)

Другие советы

Должен сказать, что я не понимаю всех «пуристов». I. Если у вас уже определено класс класса сумки - у которого есть все особенности, свойства и т. Д. - Почему Hack создают один дополнительный ненужный класс, чтобы иметь возможность следовать механизму события / ARGS, стиль подписи? Дело в том - не все, что есть в .NET - или «отсутствует из» за этот вопрос - это «хорошо» - MS «корректируя» сама ... Я бы сказал, просто пойти и создать один - как я сделал - потому что мне нужен это просто так - и спас мне много времени,

это существует.По крайней мере, это сейчас.

Вы можете найти DataEventArgs<TData> в некоторых различных сборках Microsoft/ Пространства имен, например, Microsoft.Practices.prism.events ОтказОднако это пространства имен, которые вы можете не найти естественного включения в ваш проект, чтобы вы могли просто использовать свою собственную реализацию.

В случае, если вы решите не использовать не использовать <Сильные> Призмы , но все же хотели бы попробоватьОбщие EVERYARGS Подход.

public class GenericEventArgs<T> : EventArgs
{
    public T EventData { get; private set; }

    public GenericEventArgs(T EventData)
    {
        this.EventData = EventData;
    }
}
.

// Используйте следующий пример код для объявления Objadded событие

public event EventHandler<GenericEventArgs<TargetObjType>> ObjAdded;
.

// Используйте следующий пример код для повышения objadded событие

private void OnObjAdded(TargetObjType TargetObj)
{
    if (ObjAdded!= null)
    {
        ObjAdded.Invoke(this, new GenericEventArgs<TargetObjType>(TargetObj));
    }
}
.

// и Finnaly Вы можете подписаться на ваш событие Objadded

SubscriberObj.ObjAdded +=  (object sender, GenericEventArgs<TargetObjType> e) =>
{
    // Here you can explore your e.EventData properties
};
.

Нет встроенных общих args. Если вы следите за шаблон Microsoft EventHandler, вы реализуете свои производные eventargs, как вы предложили: public class MyStringChangedEventArgs : EventArgs { public string OldValue { get; set; } }.

Тем не менее - если ваш руководство по стилю вашей команды принимает упрощение - ваш проект может использовать легкие события, такие как это:

public event Action<object, string> MyStringChanged;
.

Использование:

// How to rise
private void OnMyStringChanged(string e)
{
    Action<object, string> handler = MyStringChanged;    // thread safeness
    if (handler != null)
    {
        handler(this, e);
    }
}

// How to handle
myObject.MyStringChanged += (sender, e) => Console.WriteLine(e);
.

Обычно проекты POC используют последний подход.В профессиональных приложениях, однако, будьте в курсе обоснования COP FX # CA1009: https://msdn.microsoft.com/en-us/library/ms182133.aspx

Проблема с универсальным типом заключается в том, что даже если derivedtype наследуется от baseType, eventargs (derivedtype) не наследует от eventargs (baseType).Использование EventArgs (BaseType), таким образом, предотвратит бы позже, используя полученную версию типа.

Причина, по которой это не существует, заключается в том, что в конечном итоге произойдет, вы реализуете это, а затем, когда вы идете, чтобы заполнить T, вы должны создать класс с сильно напечатанными однозначными свойствами, которые действуют как сумка для данных для вашего мероприятияArg, но на полпути через реализацию, что вы понимаете, нет причин, по которой вы не просто делаете этот класс наследующуюся от Eventargs и называть это хорошо.

Если только вы просто хотите ни строку или что-то аналогично базовую для вашей сумки данных, и в этом случае, вероятно, есть стандарт классов Eventargs в .NET, которые предназначены для того, чтобы служить любую простую целью, которую вы получаете.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top