From 69a32831b9f972206009d57c6077ebbbc0daba87 Mon Sep 17 00:00:00 2001
From: fengjiayi <12821976+ning_xi@user.noreply.gitee.com>
Date: Mon, 28 Jul 2025 20:04:56 +0800
Subject: [PATCH] =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E8=8A=82=E7=82=B9?=
=?UTF-8?q?=E3=80=81=E6=9D=A1=E4=BB=B6=E8=A1=A8=E8=BE=BE=E5=BC=8F=E8=8A=82?=
=?UTF-8?q?=E7=82=B9=E6=94=B9=E7=94=A8Serein.Script=E8=BF=9B=E8=A1=8C?=
=?UTF-8?q?=E6=9E=84=E9=80=A0=E8=A7=A3=E6=9E=90=E6=89=A7=E8=A1=8C=EF=BC=8C?=
=?UTF-8?q?=E9=81=BF=E5=85=8D=E4=BA=86=E6=96=87=E6=9C=AC=E8=A7=A3=E6=9E=90?=
=?UTF-8?q?=E5=B8=A6=E6=9D=A5=E7=9A=84=E6=80=A7=E8=83=BD=E6=8D=9F=E8=80=97?=
=?UTF-8?q?=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Library/Enums/NodeType.cs | 9 +-
Library/FlowBaseLibrary.cs | 7 +-
Library/FlowNode/ParameterDetails.cs | 29 +---
Library/Serein.Library.csproj | 3 +
.../SereinExpression/SereinConditionParser.cs | 6 +-
NodeFlow/Env/LocalFlowEnvironment.cs | 4 +-
NodeFlow/Model/Node/SingleConditionNode.cs | 148 ++++++++++++++----
NodeFlow/Model/Node/SingleExpOpNode.cs | 92 +++++++----
README.md | 9 +-
Serein.Script/ScriptInvokeContext.cs | 2 +-
Workbench/Themes/ObjectViewerControl.xaml.cs | 20 +--
Workbench/Views/BaseNodesView.xaml | 4 +-
12 files changed, 204 insertions(+), 129 deletions(-)
diff --git a/Library/Enums/NodeType.cs b/Library/Enums/NodeType.cs
index 24f0346..7c64628 100644
--- a/Library/Enums/NodeType.cs
+++ b/Library/Enums/NodeType.cs
@@ -50,15 +50,14 @@ namespace Serein.Library
Flipflop,
///
/// 动作节点,可以异步等待
- /// 如果不显式的设置入参数据(例如文本、@Get取值表达式),就会默认使用该节点的运行时上一个节点的数据。
- /// 假如上一节点是某个对象,但入参需要的是对象中某个属性/字段,则建议使用取值表达式、表达式节点获取所需要的数据。
+ /// 如果不显式的设置入参数据,就会默认使用该节点的运行时上一个节点的数据。
+ /// 假如上一节点是某个对象,但入参需要的是对象中某个属性/字段,则建议使用表达式节点获取所需要的数据。
/// 关于@Get取值表达式的使用方法:
/// public class UserInfo
/// {
- /// public string Name; // 取值表达式:@Get .Name
- /// public string[] PhoneNums; // 获取第1项的取值表达式:@Get .PhoneNums[0]
+ /// public string Name; // 取值表达式:@Get .Name
+ /// public string[] PhoneNums; // 取值表达式:@Get .PhoneNums
/// }
- /// 取值表达式可以符合直觉的如此获取实例成员:@Get .Data.Array[2].Data......
/// 格式说明:@Get大小写不敏感,然后空一格,需要标记“.”,然后才是获取成员名称(成员名称大小写敏感)。
///
Action,
diff --git a/Library/FlowBaseLibrary.cs b/Library/FlowBaseLibrary.cs
index a470cd6..915f960 100644
--- a/Library/FlowBaseLibrary.cs
+++ b/Library/FlowBaseLibrary.cs
@@ -1,11 +1,6 @@
-using Serein.Library;
-using Serein.Library.Api;
-using Serein.Library.Utils;
-using Serein.Library.Utils.SereinExpression;
+using Serein.Library.Utils;
using System;
using System.Collections.Generic;
-using System.Dynamic;
-using System.Linq;
using System.Text;
namespace Serein.Library
diff --git a/Library/FlowNode/ParameterDetails.cs b/Library/FlowNode/ParameterDetails.cs
index 7ce5491..eae280a 100644
--- a/Library/FlowNode/ParameterDetails.cs
+++ b/Library/FlowNode/ParameterDetails.cs
@@ -1,9 +1,6 @@
using Serein.Library.Api;
using Serein.Library.Utils;
-using Serein.Library.Utils.SereinExpression;
using System;
-using System.Collections.Generic;
-using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Threading;
@@ -119,10 +116,6 @@ namespace Serein.Library
public partial class ParameterDetails
{
-
-
-
-
///
/// 用于创建元数据
@@ -276,17 +269,8 @@ namespace Serein.Library
}
}
- // 5. 表达式处理
- if (IsExplicitData && DataValue.StartsWith("@", StringComparison.OrdinalIgnoreCase))
- {
- var lower = DataValue.ToLowerInvariant();
- if (lower.StartsWith("@get") || lower.StartsWith("@dtc") || lower.StartsWith("@data"))
- {
- inputParameter = SerinExpressionEvaluator.Evaluate(DataValue, inputParameter, out _);
- }
- }
- // 6. 类型转换
+ // 5. 类型转换
if (!DataType.IsValueType && inputParameter is null)
throw new Exception($"[arg{Index}] 参数不能为null");
@@ -303,7 +287,10 @@ namespace Serein.Library
throw new Exception($"[arg{Index}] 类型不匹配:目标类型为 {DataType},实际类型为 {actualType}");
}
- ///
+
+
+
+ /* ///
/// 转为方法入参数据
///
///
@@ -347,7 +334,7 @@ namespace Serein.Library
- /*#region “枚举-类型”转换器
+ *//*#region “枚举-类型”转换器
if (ExplicitType is not null && ExplicitType.IsEnum && DataType != ExplicitType)
{
var resultEnum = Enum.Parse(ExplicitType, DataValue);
@@ -359,7 +346,7 @@ namespace Serein.Library
return value;
}
}
- #endregion*/
+ #endregion*//*
// 需要获取预入参数据
object inputParameter;
@@ -473,7 +460,7 @@ namespace Serein.Library
throw new Exception($"[arg{Index}][{Name}][{DataType}]入参类型不符合,当前预入参类型为{inputParameterType}");
}
-
+*/
public override string ToString()
{
return $"[{this.Index}] {(string.IsNullOrWhiteSpace(this.Description) ? string.Empty : $"({this.Description})")}{this.Name} : {this.DataType?.FullName}";
diff --git a/Library/Serein.Library.csproj b/Library/Serein.Library.csproj
index 214d2b1..a9448bb 100644
--- a/Library/Serein.Library.csproj
+++ b/Library/Serein.Library.csproj
@@ -42,12 +42,15 @@
+
+
+
diff --git a/Library/Utils/SereinExpression/SereinConditionParser.cs b/Library/Utils/SereinExpression/SereinConditionParser.cs
index 912367b..bbf09e5 100644
--- a/Library/Utils/SereinExpression/SereinConditionParser.cs
+++ b/Library/Utils/SereinExpression/SereinConditionParser.cs
@@ -63,6 +63,7 @@ namespace Serein.Library.Utils.SereinExpression
///
/// 条件解析器(生成IL进行判断)
/// 格式: data.[propertyName] [operator] [value]
+ /// 返回值:boolea
///
public class SereinConditionParser
{
@@ -113,11 +114,6 @@ namespace Serein.Library.Utils.SereinExpression
}
- //bool ContainsArithmeticOperators(string expression)
- //{
- // return expression.Contains('+') || expression.Contains('-') || expression.Contains('*') || expression.Contains('/');
- //}
-
}
///
diff --git a/NodeFlow/Env/LocalFlowEnvironment.cs b/NodeFlow/Env/LocalFlowEnvironment.cs
index a4ca601..f312ff4 100644
--- a/NodeFlow/Env/LocalFlowEnvironment.cs
+++ b/NodeFlow/Env/LocalFlowEnvironment.cs
@@ -1,8 +1,6 @@
using Serein.Library;
using Serein.Library.Api;
using Serein.Library.Utils;
-using Serein.Library.Utils.SereinExpression;
-using Serein.NodeFlow.Model.Library;
using Serein.NodeFlow.Services;
using Serein.NodeFlow.Tool;
using System.Text;
@@ -667,7 +665,7 @@ namespace Serein.NodeFlow.Env
// "NodeModel.Path"
if (TryGetNodeModel(nodeGuid, out var nodeModel))
{
- SerinExpressionEvaluator.Evaluate($"@Set .{path} = {value}", nodeModel, out _); // 更改对应的数据
+ //SerinExpressionEvaluator.Evaluate($"@Set .{path} = {value}", nodeModel, out _); // 更改对应的数据
}
diff --git a/NodeFlow/Model/Node/SingleConditionNode.cs b/NodeFlow/Model/Node/SingleConditionNode.cs
index ebe8952..9849f7d 100644
--- a/NodeFlow/Model/Node/SingleConditionNode.cs
+++ b/NodeFlow/Model/Node/SingleConditionNode.cs
@@ -1,9 +1,6 @@
using Serein.Library;
using Serein.Library.Api;
-using Serein.Library.Utils;
-using Serein.Library.Utils.SereinExpression;
-using System;
-using System.ComponentModel;
+using Serein.Script;
using System.Dynamic;
using System.Linq.Expressions;
@@ -125,44 +122,41 @@ namespace Serein.NodeFlow.Model
// 使用自动取参
var pd = MethodDetails.ParameterDetailss[INDEX_EXPRESSION];
var hasNode = context.Env.TryGetNodeModel(pd.ArgDataSourceNodeGuid, out var argSourceNode);
- if (hasNode)
+ if (!hasNode)
{
- context.NextOrientation = ConnectionInvokeType.IsError;
- return new FlowResult(this.Guid, context);
- }
- if (hasNode)
- {
- return new FlowResult(this.Guid, context);
- }
- if (pd.ArgDataSourceType == ConnectionArgSourceType.GetOtherNodeData)
- {
- result = context.GetFlowData(argSourceNode.Guid).Value; // 使用自定义节点的参数
- }
- else if (pd.ArgDataSourceType == ConnectionArgSourceType.GetOtherNodeDataOfInvoke)
- {
- CancellationTokenSource cts = new CancellationTokenSource();
- var nodeResult = await argSourceNode.ExecutingAsync(context, cts.Token);
- result = nodeResult.Value;
- cts?.Cancel();
- cts?.Dispose();
+ /*context.NextOrientation = ConnectionInvokeType.IsError;
+ return new FlowResult(this.Guid, context);*/
+ parameter = null;
}
else
{
- result = context.TransmissionData(this.Guid).Value; // 条件节点透传上一节点的数据
+ if (pd.ArgDataSourceType == ConnectionArgSourceType.GetOtherNodeData)
+ {
+ result = context.GetFlowData(argSourceNode.Guid).Value; // 使用自定义节点的参数
+ }
+ else if (pd.ArgDataSourceType == ConnectionArgSourceType.GetOtherNodeDataOfInvoke)
+ {
+ CancellationTokenSource cts = new CancellationTokenSource();
+ var nodeResult = await argSourceNode.ExecutingAsync(context, cts.Token);
+ result = nodeResult.Value;
+ cts?.Cancel();
+ cts?.Dispose();
+ }
+ else
+ {
+ result = context.TransmissionData(this.Guid).Value; // 条件节点透传上一节点的数据
+ }
+ parameter = result; // 使用上一节点的参数
}
- parameter = result; // 使用上一节点的参数
+
}
else
{
var exp = ExplicitData?.ToString();
- if (!string.IsNullOrEmpty(exp) && exp.StartsWith('@'))
+ if (!string.IsNullOrWhiteSpace(exp) && exp.StartsWith("@Get", StringComparison.OrdinalIgnoreCase))
{
- parameter = result; // 表达式获取上一节点数据
- if (parameter is not null)
- {
- parameter = SerinExpressionEvaluator.Evaluate(exp, parameter, out _);
- }
+ parameter = GetValueExpressionAsync(context, result, exp);
}
else
{
@@ -173,7 +167,8 @@ namespace Serein.NodeFlow.Model
bool judgmentResult = false;
try
{
- judgmentResult = SereinConditionParser.To(parameter, Expression);
+ judgmentResult = await ConditionExpressionAsync(context, parameter, Expression);
+ //judgmentResult = SereinConditionParser.To(parameter, Expression);
context.NextOrientation = judgmentResult ? ConnectionInvokeType.IsSucceed : ConnectionInvokeType.IsFail;
}
catch (Exception ex)
@@ -189,6 +184,95 @@ namespace Serein.NodeFlow.Model
+
+ ///
+ /// 解析取值表达式
+ ///
+ private SereinScript getValueScript;
+ private string getValueExpression;
+ private async Task