Обобщения и события — есть ли какой-либо способ сделать это?

#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; }
    } 
}