#c# #events #eventhandler
Вопрос:
Я хочу отслеживать аргумент, переданный в аргументе в подписке на события, чтобы я мог после выбора/сужения своих вызовов.
public List<Tags> _toSpecificTagSubscribed = new List<Tags>();
private event Action<Tags> _onSpecificTagEvent;
public event Action<Tags> OnSpecificTagEvent {
add {
_onSpecificTagCollision = value;
if (!_toSpecificTagSubscribed.Contains(<TagArgumentValue>))
_toSpecificTagSubscribed.Add(<TagArgumentValue>);
}
remove { _onSpecificTagEvent -= value; }
}
}
Смотрите <TagArgumentValue>
. Это передается в самом событии по подписке, поэтому мне интересно, как получить к нему доступ. Было бы своего рода value.<TagArgumentValue>
, что означает значение аргумента, переданного в событие.
Возможно ли это? Как?
Ответ №1:
Если я вас правильно понимаю, вы путаете «информацию, предоставленную при возникновении события», с «информацией, предоставленной в обработчике событий».
Ан Action<Tags>
может делать все, что угодно, с Tags
тем, что ему предоставляется. Он может отвечать только на определенные теги, но это просто произвольный код.
Если вы хотите иметь возможность подписаться только на определенный тег, вам нужно, чтобы это было частью информации о подписке, например
public void AddTagHandler(Tags tag, Action<Tags> handler)
Потенциально вы можете использовать a Dictionary<Tags, Action<Tags>>
для отслеживания обработчиков, подписанных на любой данный тег.
(Возможно, вы также захотите проверить, что Tags
это правильное имя для типа — похоже, оно должно представлять один тег, а не набор тегов, учитывая, как вы его используете.)
Комментарии:
1. Все именно так, как вы говорите. Что касается имени, может быть, оно не такое непропорциональное, как
Tags
тип перечисления, поэтому то, что передается, является значением тега из возможногоTags
. Хотя мне нужно было бы подумать об этом. Большое спасибо 🙂2. @rustyBucketBay: Если каждое значение должно быть одним тегом, его следует вызвать
Tag
. Если одно значение представляет собой побитовую комбинацию потенциально нескольких тегов, тоTags
оно подходит, и к нему должен быть[Flags]
применен атрибут, но это значительно усложнило бы логику здесь.3. Я согласен, я не нахожу это вводящим в заблуждение, потому что я привык к своему коду, но это так 🙂