Я готовлюсь создавать универсальный класс EventArgs для события args, которые несут отдельный аргумент:
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
, который позволяет вам определять делегата для любого конкретного типа EventArgs.
Я лично не считаю, что EventArgs
так же хорошо подходит. Информация, используемая в качестве «полезной нагрузки» в аргументах событий, должна, на мой взгляд, быть настраиваемым классом, чтобы сделать ее использование и ожидаемые свойства очень понятными. Использование универсального класса не позволит вам поставить на место осмысленные имена. (Что представляют собой «Данные»?)
Проблема с универсальным типом заключается в том, что даже если DerivedType наследуется от BaseType, EventArgs (DerivedType) не будет наследовать от EventArgs (BaseType). Таким образом, использование EventArgs (BaseType) предотвратит последующее использование производной версии типа.
Причина, по которой этого не существует, заключается в том, что в итоге произойдет следующее: вы реализуете это, а затем, когда вы перейдете к заполнению T, вы должны создать класс с сильно типизированными однозначными свойствами, который действует как пакет данных для вашего event arg, но на полпути реализации этого вы понимаете, что нет причин, по которым вы не можете просто сделать этот класс наследуемым от EventArgs и назвать его хорошим.
Если только вам не нужна просто строка или что-то подобное базовое для вашего мешка данных, в этом случае, вероятно, в .NET есть стандартные классы EventArgs, которые предназначены для любой простой цели, которую вы преследуете.