使用MulticastDelegate作为参数,同时避免DynamicInvoke我有一个MulticastDelegate,它引用具有相同签名的许多(遗留)委托之一。例如:publicdelegatevoidObjectCreated(objectsender,EventArgsargs);publicdelegatevoidObjectDeleted(objectsender,EventArgsargs);//...这些委托随后用于定义事件:publiceventObjectCreatedObjectWasCreated;公共事件ObjectDeletedObjectWasDeleted;然后我有一个采用MulticastDelegate的方法,我用它来做一些常见的检查:参数);这是从定义事件的类的其他一些方法调用的:DispatchEvent(ObjectWasCreated,sender,args);DispatchEvent(ObjectWasDeleted,sender,args);有没有更简洁的方法来避免DynamicInvoke?这是我的无反射解决方案。它基本上将多播委托实现为一个列表。更少的代码?不。更好的性能?我不知道。清洁工?嗯。publicdelegatevoidObjectCreated(objectsender,EventArgsargs);publicdelegatevoidObjectDeleted(objectsender,EventArgsargs);公共事件ObjectCreatedObjectWasCreated{添加{m_ObjectCreatedSubscribers.Add(value.Invoke);e.Target.Equals(值));}}公共事件ObjectDeletedObjectWasDeleted{添加{m_ObjectDeletedSubscribers.Add(value.Invoke);}移除{m_ObjectDeletedSubscribers.RemoveAll(e=>e.Target.Equals(value));}}私有列表>m_ObjectCreatedSubscribers=新列表>();私有列表>m_ObjectDeletedSubscribers=新列表>();voidDispatchEvent(List>subscribers,objectsender,EventArgsargs){foreach(varsubscriberinsubscribers)subscriber(sender,args);一个简单的替代方法是使用内置类型,例如Action或EventHandler而不是自定义委托,以获得强类型。公共静态事件ActionObjectWasCreated;公共静态事件ActionObjectWasDeleted;voidDispatchEvent(Actionhandler,objectsender,EventArgsargs){if(handler!=null){//...handler(sender,args);}}或公共静态事件EventHandlerObjectWasCreated;公共静态事件EventHandlerObjectWasDeleted;voidDispatchEvent(EventHandlerhandler,objectsender,EventArgsargs){if(handler!=null){//...handler(sender,args);现在你的方法调用非常简单。DispatchEvent(ObjectWasCreated,sender,args);DispatchEvent(ObjectWasDeleted,sender,args);但这大多不是一个好的解决方案。你可以使用动态的,仍然比DynamicInvoke更好:}}或者泛型:voidDispatchEvent(Thandler,objectsender,EventArgsargs){if(handler!=null){//...((dynamic)handler)(sender,args);我做了一个小的性能比较,发现动态实际上好得令人难以置信:百万次尝试MulticastDelegate+dynamic(第一个例子)=>40msgeneric+dynamic(第二个例子)=>90msMulticastDelegate+DynamicInvoke(最初给出problem)=>940ms你可以这样做:));事件处理程序(发件人,参数);但我不确定这是否比使用DynamicInvoke更快。你必须在某处使用反射。如果每个delegate只能保证一个subscriber,那么在创建EventHandler的时候可以直接使用Delegate.Method属性,但是由于是事件,可能会有多个subscribers...以上是C#学习教程:UsingMulticastDelegateasParameters,同时避免使用DynamicInvoke共享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
