C# 通用发布事件类
我试图开发一个通用类来引发一个事件 在运行时,我不知道将出现什么实体,这就是为什么我决定将其设置为泛型。问题是,可以存在的每个类型都继承自基类C# 通用发布事件类,c#,wpf,C#,Wpf,我试图开发一个通用类来引发一个事件 在运行时,我不知道将出现什么实体,这就是为什么我决定将其设置为泛型。问题是,可以存在的每个类型都继承自基类EntityBase 在这个类中,我返回(或者我想:p)具有正确类型的事件 public class EntityModifiedEventFactory<TEntity> : IEntityModifiedEventFactory<TEntity> where TEntity : EntityBase { private
EntityBase
- 在这个类中,我返回(或者我想:p)具有正确类型的事件
public class EntityModifiedEventFactory<TEntity> : IEntityModifiedEventFactory<TEntity> where TEntity : EntityBase { private readonly IEventAggregator eventAggregator; public EntityModifiedEventFactory(IEventAggregator eventAggregator) { ParameterChecker.IsNotNull(eventAggregator, "eventAggregator"); this.eventAggregator = eventAggregator; } public EntityModifiedEvent<TEntity> Create() { return this.eventAggregator.GetEvent<EntityModifiedEvent<TEntity>>(); } }
我终于解决了这个问题。如果有人经历了像我这样的事情,这就是答案:private void OnNotifyAgentEntityChanged(object sender, EntityChangedEventArgs entityChangedEventArgs) { this.PublishEvent((TEntity)entityChangedEventArgs.Entity); } private void PublishEvent(TEntity entity) { object args = this.GetEventArgs(entity); object eventObject = this.GetEventObject(entity); MethodInfo publishMethod = eventObject.GetType().GetMethod("Publish"); publishMethod.Invoke(eventObject, new[] { args }); } private object GetEventArgs(TEntity entity) { Type viewModelIdentifierEventArgsType = typeof(ViewModelIdentifierEventArgs<>).MakeGenericType(entity.GetType()); object args = Activator.CreateInstance(viewModelIdentifierEventArgsType, Guid.NewGuid(), entity); return args; } private object GetEventObject(TEntity entity) { MethodInfo getEventMethod = typeof(IEventAggregator).GetMethod("GetEvent"); Type entityModifiedEventType = typeof(EntityModifiedEvent<>).MakeGenericType(entity.GetType()); MethodInfo genericGetEventMethod = getEventMethod.MakeGenericMethod(entityModifiedEventType); object eventObject = genericGetEventMethod.Invoke(this.eventAggregator, null); return eventObject; }
NotifyAgentEntityChanged上的私有void(对象发送方,EntityChangedEventArgs EntityChangedEventArgs) { this.PublishEvent((tenty)entityChangedEventArgs.Entity); } 私有事件(TEntity实体) { 对象args=this.GetEventArgs(实体); object eventObject=this.GetEventObject(实体); MethodInfo publishMethod=eventObject.GetType().GetMethod(“发布”); Invoke(eventObject,new[]{args}); } 私有对象GetEventArgs(TEntity实体) { 类型ViewModelIdentifierEventTargetType=typeof(ViewModelIdentifierEventTargets).MakeGenericType(entity.GetType()); 对象args=Activator.CreateInstance(ViewModelIdentifierEventTargetType,Guid.NewGuid(),实体); 返回args; } 私有对象GetEventObject(TEntity实体) { MethodInfo getEventMethod=typeof(IEventAggregator).GetMethod(“GetEvent”); Type entityModifiedEventType=typeof(EntityModifiedEvent).MakeGenericType(entity.GetType()); MethodInfo genericGetEventMethod=getEventMethod.MakeGenericMethod(entityModifiedEventType); object eventObject=genericGetEventMethod.Invoke(this.eventAggregator,null); 返回事件对象; }
通过这样做,我可以发布任何
,而不考虑EntityModifiedEvent
。我只需要在我的tenty
中添加EntityChangedEventArgs
,这样就可以对其进行des/serialized编译器无法推断运行时提供的类型。您能否提供在哪里调用NotifyAgentEntityChanged方法?你能不能简单地用正确的entit ytype使EntityChangedEventArgs也通用?@HimBromBeereKnownType
它被一个WCF服务调用,在这里发布它会非常巨大OnNotifyAgentityChanged
将事件发布给已订阅的人,如果订阅者是OnNotifyAgentEntityChanged
或树
,则会有所不同。发布此动物
和发布此EntityModifiedEvent
并不相同,即使它们继承自EntityModifiedEvent
。明确地说,我的问题是如何(如果可能的话)覆盖EntityBase
的泛型类型。EntityModifiedEventFactory
ViewModelIdentifierEventArgs<Tree> eventArgs = new ViewModelIdentifierEventArgs<Tree>(entityChangedEventArgs.ViewModelIdentifier, (Tree)entityChangedEventArgs.Entity); IEntityModifiedEventFactory<Tree> entityModifiedEventFactory = new EntityModifiedEventFactory<Tree> ((Tree)entityChangedEventArgs.Entity, this.eventAggregator); EntityModifiedEvent<Tree> entityModifiedEvent = entityModifiedEventFactory.Create(); entityModifiedEvent.Publish(eventArgs);
private void OnNotifyAgentEntityChanged(object sender, EntityChangedEventArgs entityChangedEventArgs) { this.PublishEvent((TEntity)entityChangedEventArgs.Entity); } private void PublishEvent(TEntity entity) { object args = this.GetEventArgs(entity); object eventObject = this.GetEventObject(entity); MethodInfo publishMethod = eventObject.GetType().GetMethod("Publish"); publishMethod.Invoke(eventObject, new[] { args }); } private object GetEventArgs(TEntity entity) { Type viewModelIdentifierEventArgsType = typeof(ViewModelIdentifierEventArgs<>).MakeGenericType(entity.GetType()); object args = Activator.CreateInstance(viewModelIdentifierEventArgsType, Guid.NewGuid(), entity); return args; } private object GetEventObject(TEntity entity) { MethodInfo getEventMethod = typeof(IEventAggregator).GetMethod("GetEvent"); Type entityModifiedEventType = typeof(EntityModifiedEvent<>).MakeGenericType(entity.GetType()); MethodInfo genericGetEventMethod = getEventMethod.MakeGenericMethod(entityModifiedEventType); object eventObject = genericGetEventMethod.Invoke(this.eventAggregator, null); return eventObject; }