У меня есть пользовательская коллекция, к которой я добавляю событие ValidateItem. Это событие ValidateItem будет вызываться всякий раз, когда элемент добавляется или обновляется в пользовательской коллекции.
Я хочу позволить производным классам иметь возможность подписываться на событие и определять свою собственную логику того, является ли элемент «допустимым» и потенциально запрещать его добавление в коллекцию, если он «недействителен».
Но я пытаюсь выяснить, как сообщить вызывающему участнику события, что происходит, и как передать информацию о происходящем обратно.
Мои пользовательские eventargs наследуются от CancelEventArgs, поэтому у меня есть возможность передать бит Cancel обратно вызывающей стороне, используя это. Но я никогда не встречал случаев, когда информация об ошибках (коды ошибок, сообщения и т. Д.) Передавалась бы таким образом, поэтому мне интересно, может быть, это не лучший подход.
Должен ли я просто добавить какие-либо данные об ошибках, которые я хочу передать обратно в мой класс пользовательских событий, есть ли веские причины для этого или против? или есть другие, лучшие способы сделать это?
Вот мой класс eventargs:
public delegate void ItemValidationEventHandler(object sender, ItemValidationEventArgs e);
public class ItemValidationEventArgs : CancelEventArgs
{
public ItemValidationEventArgs(object item, ObjectAction state, EventArgs e)
{
Item = item;
State = state;
EventArgs = e;
}
public ItemValidationEventArgs(object item, ObjectAction state) : this(item, state, new EventArgs())
{
}
public ItemValidationEventArgs() : this(null, ObjectAction.None, new EventArgs())
{
}
// is there a better way to pass this info?
public string ErrorMessage {get; set;}
public int ErrorNumber {get;set;}
public object Item { get; private set; }
public ObjectAction State { get; private set; }
public EventArgs EventArgs { get; private set; }
}
ОБНОВЛЕНИЕ: я полагаю, что другой вариант будет использовать что-то вроде этого:
virtual bool Validate(object item, ObjectAction action, out string errorMessage)
метод в производных классах. Хотя я предпочитаю избегать параметров ...
Если у кого-нибудь есть идеи о плюсах и минусах каждого подхода, я бы хотел их услышать!
Спасибо,
Max