using Serein.Library.Utils; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static Serein.Library.Utils.EmitHelper; namespace Serein.Library.Entity { /// /// Emit创建的委托描述,用于WebApi、WebSocket、NodeFlow动态调用方法的场景。 /// 一般情况下你无须内部细节,只需要调用 Invoke() 方法即可。 /// public class DelegateDetails { public DelegateDetails(EmitMethodType EmitMethodType, Delegate EmitDelegate) { this._emitMethodType = EmitMethodType; this._emitDelegate = EmitDelegate; } public void Upload(EmitMethodType EmitMethodType, Delegate EmitDelegate) { _emitMethodType = EmitMethodType; _emitDelegate = EmitDelegate; } private Delegate _emitDelegate; private EmitMethodType _emitMethodType; public Delegate EmitDelegate { get => _emitDelegate; } public EmitMethodType EmitMethodType { get => _emitMethodType; } /// /// 异步等待Emit创建的委托。 /// 需要注意的是,传入的实例必须包含创建委托的方法信息,传入的参数也必须符合方法入参信息。 /// /// 实例 /// 入参 /// 返回值 public async Task Invoke(object instance, object[] args) { object result = null; try { if (EmitMethodType == EmitMethodType.HasResultTask && EmitDelegate is Func> hasResultTask) { result = await hasResultTask(instance, args); } else if (EmitMethodType == EmitMethodType.Task && EmitDelegate is Func task) { await task.Invoke(instance, args); result = null; } else if (EmitMethodType == EmitMethodType.Func && EmitDelegate is Func func) { result = func.Invoke(instance, args); } else { throw new NotImplementedException("创建了非预期委托(应该不会出现)"); } return result; } catch { throw; } } } }