mirror of
https://gitee.com/langsisi_admin/serein-flow
synced 2026-03-03 00:00:49 +08:00
使用emit代替表达式树构造委托。
内置了websocket server与相应的导航功能,可在实例工程中找到相应的实现。
This commit is contained in:
@@ -197,49 +197,69 @@ namespace Serein.NodeFlow.Base
|
||||
{
|
||||
throw new Exception($"节点{this.Guid}不存在方法信息,请检查是否需要重写节点的ExecutingAsync");
|
||||
}
|
||||
if (!context.Env.TryGetDelegate(md.MethodName, out var del))
|
||||
if (!context.Env.TryGetDelegateDetails(md.MethodName, out var dd))
|
||||
{
|
||||
throw new Exception($"节点{this.Guid}不存在对应委托");
|
||||
}
|
||||
md.ActingInstance ??= context.Env.IOC.Get(md.ActingInstanceType);
|
||||
object instance = md.ActingInstance;
|
||||
|
||||
bool haveParameter = md.ExplicitDatas.Length > 0;
|
||||
bool haveResult = md.ReturnType != typeof(void);
|
||||
Type? taskResult = null;
|
||||
bool isTask = md.ReturnType is not null && MethodDetailsHelperTmp.IsGenericTask(md.ReturnType, out taskResult);
|
||||
bool isTaskHaveResult = taskResult is not null;
|
||||
object? result;
|
||||
//bool haveParameter = md.ExplicitDatas.Length > 0;
|
||||
//bool haveResult = md.ReturnType != typeof(void);
|
||||
// Type? taskResult = null;
|
||||
//bool isTask = md.ReturnType is not null && MethodDetailsHelper.IsGenericTask(md.ReturnType, out taskResult);
|
||||
//bool isTaskHaveResult = taskResult is not null;
|
||||
object? result = null;
|
||||
|
||||
//Console.WriteLine($"(isTask, isTaskHaveResult):{(isTask, isTaskHaveResult)}");
|
||||
try
|
||||
{
|
||||
// Action/Func([方法作用的实例],[可能的参数值],[可能的返回值])
|
||||
|
||||
object?[]? parameters = GetParameters(context, this, md);
|
||||
if (isTask)
|
||||
object?[]? args = GetParameters(context, this, md);
|
||||
var delType = dd.EmitMethodType;
|
||||
var del = dd.EmitDelegate;
|
||||
if (delType == EmitHelper.EmitMethodType.HasResultTask && del is Func<object, object?[]?, Task<object?>> hasResultTask)
|
||||
{
|
||||
// 异步方法(因为返回了Task,所以排除Action<>委托的可能)
|
||||
result = (haveParameter, isTaskHaveResult) switch
|
||||
{
|
||||
(false, false) => await ExecutionAsync((Func<object, Task>)del, instance), // 调用节点方法,返回方法传回类型
|
||||
(true, false) => await ExecutionAsync((Func<object, object?[]?, Task>)del, instance, parameters), // 调用节点方法,获取入参参数,返回方法返回类型
|
||||
(false, true) => await ExecutionAsync((Func<object, Task<object?>>)del, instance), // 调用节点方法,返回方法传回类型
|
||||
(true, true) => await ExecutionAsync((Func<object, object?[]?, Task<object?>>)del, instance, parameters), // 调用节点方法,获取入参参数,返回方法返回类型
|
||||
};
|
||||
result = await hasResultTask(instance, args);
|
||||
}
|
||||
else if (delType == EmitHelper.EmitMethodType.Task && del is Func<object, object?[]?, Task> task)
|
||||
{
|
||||
await task.Invoke(instance, args);
|
||||
result = null;
|
||||
}
|
||||
else if (delType == EmitHelper.EmitMethodType.Func && del is Func<object, object?[]?, object?> func)
|
||||
{
|
||||
result = func.Invoke(instance, args);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 非异步方法
|
||||
result = (haveParameter, haveResult) switch
|
||||
{
|
||||
(false, false) => Execution((Action<object>)del, instance), // 调用节点方法,返回null
|
||||
(true, false) => Execution((Action<object, object?[]?>)del, instance, parameters), // 调用节点方法,返回null
|
||||
(false, true) => Execution((Func<object, object?>)del, instance), // 调用节点方法,返回方法传回类型
|
||||
(true, true) => Execution((Func<object, object?[]?, object?>)del, instance, parameters), // 调用节点方法,获取入参参数,返回方法返回类型
|
||||
};
|
||||
throw new NotImplementedException("构造委托无法正确调用");
|
||||
}
|
||||
|
||||
//if (isTask)
|
||||
//{
|
||||
// // 异步方法(因为返回了Task,所以排除Action<>委托的可能)
|
||||
// result = (haveParameter, isTaskHaveResult) switch
|
||||
// {
|
||||
// (false, false) => await ExecutionAsync((Func<object, Task>)del, instance), // 调用节点方法,返回方法传回类型
|
||||
// (true, false) => await ExecutionAsync((Func<object, object?[]?, Task>)del, instance, parameters), // 调用节点方法,获取入参参数,返回方法返回类型
|
||||
// (false, true) => await ExecutionAsync((Func<object, Task<object?>>)del, instance), // 调用节点方法,返回方法传回类型
|
||||
// (true, true) => await ExecutionAsync((Func<object, object?[]?, Task<object?>>)del, instance, parameters), // 调用节点方法,获取入参参数,返回方法返回类型
|
||||
// };
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// // 非异步方法
|
||||
// result = (haveParameter, haveResult) switch
|
||||
// {
|
||||
// (false, false) => Execution((Action<object>)del, instance), // 调用节点方法,返回null
|
||||
// (true, false) => Execution((Action<object, object?[]?>)del, instance, parameters), // 调用节点方法,返回null
|
||||
// (false, true) => Execution((Func<object, object?>)del, instance), // 调用节点方法,返回方法传回类型
|
||||
// (true, true) => Execution((Func<object, object?[]?, object?>)del, instance, parameters), // 调用节点方法,获取入参参数,返回方法返回类型
|
||||
// };
|
||||
//}
|
||||
|
||||
NextOrientation = ConnectionType.IsSucceed;
|
||||
return result;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user