创建和覆盖被放入参数的接口

Creating and overriding an interface being put into a parameter

目前我正在将代码从 Java 转换为 C# 并使用一个函数:

        eventManager.Listen(typeof(EntityCreateEvent), 
        new EntityCreateListener()
        {
            public override void Create(Entity Entity)
            {
                //add(entity);
            }
        });

问题是,这在 C# 中是不合法的。我如何在 C# 中执行此操作?我不想做变通方法,因为我正在更改的代码中有很多这样的代码,覆盖中的内容需要是动态的。

此处您正在创建一个事件侦听器。

Java 提供匿名接口作为订阅事件的方式。

C# 没有匿名接口。但是,语言中内置了一个事件框架。

因此,与其在 EventManager 上公开 Listen 方法,不如公开一个事件:

 class EntityCreatedEventArgs : EventArgs
 {
      public Entity Entity {get; set; }
 }

 class EventManager
 {
      public event EventHandler<EntityCreatedEventArgs> EntityCreate;


      private void FireCreateEvent(Entity entity)
      {
          if(this.EntityCreate)
          {
               this.EntityCreate(this, new EntityCreatedEventArgs { Entity = entity });
          }
      }
      // Rest of implementation
 }

那么你的收听 class 可以 'subscribe' 这个事件

 public class OtherThing
 {
       public OtherThing(EventManager eventManager)
       {
           eventManager.EntityCreate += this.EventManager_EntityCreate;
       }

       void EventManager_EntityCreate(object sender, EntityCreatedEventArgs args)
       {
       }
 }