创建和覆盖被放入参数的接口
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)
{
}
}
目前我正在将代码从 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)
{
}
}