C# 泛型和事件-有什么方法可以做到这一点吗?

C# 泛型和事件-有什么方法可以做到这一点吗?,c#,events,generics,C#,Events,Generics,在我最近遇到的订阅/取消订阅和通知并发的所有问题之后,我尝试将我放在一个泛型类中并使用它 唉,我找不到办法,因为这是不允许的: public class LCLMulticastEvent<T> where T: System.MulticastDelegate { private event T internalEvent; private object lockObject = new object(); public

在我最近遇到的订阅/取消订阅和通知并发的所有问题之后,我尝试将我放在一个泛型类中并使用它

唉,我找不到办法,因为这是不允许的:

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

    }
公共类LCL MulticastEvent,其中T:System.MulticastDelegate
{
私人事件T内部事件;
私有对象lockObject=新对象();
公共事件
{ 
添加
{ 
锁定(锁定对象)
{
内部事件+=值;
}
}
去除
{ 
锁定(锁定对象)
{
内部事件+=值;
}
}
}
public void notify(参数对象[]参数)
{ 
if(internalEvent!=null)
{
锁定(锁定对象)
{
foreach(T internalEvent.GetInvocationList()中的被调用方)
{
被调用方.DynamicInvoke(args);
}
}
}
}
}
编译器拒绝接受System.MulticastDelegate,说它是一个特殊类

有什么办法吗

编辑:在我的第一次展览中,我试图过于简短。 我想实现一种线程安全的事件包装器。 @托马斯:DynamicInvoke应该是解决方案

短暂性脑缺血发作


Mario

我不太清楚您在这里想要实现什么,但这可能会有所帮助:您可以在
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; }
    } 
}
公共类LCL MulticastEvent,其中TEventArgs:EventArgs
{
私有事件EventHandler internalEvent;
私有对象lockObject=新对象();
公共事件处理程序EventHandler OneEvent
{ 
添加{internalEvent+=value;}
删除{internalEvent-=value;}
} 
}

您遇到了哪些问题?你只需订阅一个
活动
,就可以了…你想做什么还不是很清楚。。。你能提供更多的细节吗?不管怎样,你会如何提出这项活动?你需要知道代表的签名…@Thomas:看我的帖子,DynamicInvoke来到了我的办公室rescue@Tejs:再次说明订阅/取消订阅和通知不是线程安全的(已同步)