#c# #events #generics
#c# #Мероприятия #обобщения
Вопрос:
После всех проблем, с которыми я недавно столкнулся с параллелизмом подписки / отказа от подписки и уведомления, я попытался поместить i tall в универсальный класс и использовать его.
Увы, я не могу найти способ, поскольку это запрещено:
public class LCLMulticastEvent<T> where T: System.MulticastDelegate
{
private event T internalEvent;
private object lockObject = new object();
public event T OnEvent
{
add
{
lock( lockObject )
{
internalEvent = value;
}
}
remove
{
lock( lockObject )
{
internalEvent = value;
}
}
}
public void notify( params object[] args)
{
if( internalEvent != null )
{
lock( lockObject )
{
foreach( T invokee in internalEvent.GetInvocationList() )
{
invokee.DynamicInvoke( args );
}
}
}
}
}
Компилятор отказывается принимать System.MulticastDelegate
, говоря, что это особый класс…
Есть ли какой-либо способ сделать это?
Редактировать: Я пытался быть слишком кратким в своих первых объяснениях. Чего я хотел, так это реализовать своего рода потокобезопасную оболочку событий. @Thomas: решением должен был стать DynamicInvoke…
TIA
Марио
Комментарии:
1. Какие у вас проблемы? Все, что вам нужно, это просто создать
event
подписку…2. Не очень понятно, что вы пытаетесь сделать … не могли бы вы рассказать подробнее?
3. И в любом случае, как бы вы вызвали событие? Вам нужно знать подпись делегата…
4. @Thomas: Смотрите мой пост, DynamicInvoke пришел мне на помощь
5. @Tejs: снова подписка / отмена подписки и уведомления не являются потокобезопасными (синхронизированы)
Ответ №1:
Мне не совсем понятно, чего вы пытаетесь здесь достичь, но, возможно, это поможет: вы можете сделать класс универсальным в EventArgs
типе вместо MulticastDelegate
public class LCLMulticastEvent<TEventArgs> where TEventArgs : EventArgs
{
private event EventHandler<TEventArgs> internalEvent;
private object lockObject = new object();
public event EventHandler<TEventArgs> OnEvent
{
add { internalEvent = value; }
remove { internalEvent -= value; }
}
}