为了账号安全,请及时绑定邮箱和手机立即绑定

通用发布事件类

通用发布事件类

C#
米脂 2021-10-24 19:27:57
我正在尝试开发一个通用类来引发事件。在运行时,我不知道那里会出现什么实体,这就是我决定将其设为通用的原因。问题是,可以存在的每个类型都继承自基类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){    ViewModelIdentifierEventArgs<entityChangedEventArgs.Entity.GetType()> eventArgs = new ViewModelIdentifierEventArgs<entityChangedEventArgs.Entity.GetType() > (entityChangedEventArgs.ViewModelIdentifier, (entityChangedEventArgs.Entity.GetType())entityChangedEventArgs.Entity);    IEntityModifiedEventFactory<entityChangedEventArgs.Entity.GetType() > entityModifiedEventFactory = new EntityModifiedEventFactory<entityChangedEventArgs.Entity.GetType()> ((entityChangedEventArgs.Entity.GetType())entityChangedEventArgs.Entity, this.eventAggregator);    EntityModifiedEvent<entityChangedEventArgs.Entity.GetType()> entityModifiedEvent = entityModifiedEventFactory.Create();    entityModifiedEvent.Publish(eventArgs);}我应该如何编写特定类型来构建我的EntityModifiedEventFactory? . 我试过这个,entityChangedEventArgs.Entity.GetType()但我没有办法让它工作。如果我离开TEntity的IEntityModifiedEventFactory<TEntity> entityModifiedEventFactory...将是一个EntityBase和我需要它是一个Animal或一个Tree类型的就像我说的继承EntityBas
查看完整描述

1 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

我终于设法解决了这个问题。所以这是万一有人经历过像我一样的事情的答案:


    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;

    }

通过这样做,EntityModifiedEvent<>无论TEntity. 我只需要添加KnownType我的,EntityChangedEventArgs以便它可以被反/序列化


查看完整回答
反对 回复 2021-10-24
  • 1 回答
  • 0 关注
  • 205 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信