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
    中添加
    KnownType
    ,这样就可以对其进行des/serialized

    编译器无法推断运行时提供的类型。您能否提供在哪里调用NotifyAgentEntityChanged方法?你能不能简单地用正确的entit ytype使EntityChangedEventArgs也通用?@HimBromBeere
    OnNotifyAgentityChanged
    它被一个WCF服务调用,在这里发布它会非常巨大
    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;
        }