using System; namespace ET { public interface IEvent { Type Type { get; } } public abstract class AEvent: IEvent where A: struct { public Type Type { get { return typeof (A); } } protected abstract ETTask Run(Scene scene, A a); public async ETTask Handle(Scene scene, A a) { try { await Run(scene, a); } catch (Exception e) { Log.Error(e); } } } public abstract class BEvent: IEvent { public Type Type { get { return typeof(A); } } public abstract void OnEvent(A a); } }