新增了NodeParamAttribute特性,用来指示类库节点的行为

This commit is contained in:
fengjiayi
2025-05-30 11:53:33 +08:00
parent a9533ad58a
commit ce42f45ff6
4 changed files with 58 additions and 62 deletions

View File

@@ -58,7 +58,7 @@ namespace Serein.Library
/// <para>表示该类中存在节点信息</para>
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public class DynamicFlowAttribute : Attribute
public sealed class DynamicFlowAttribute : Attribute
{
public DynamicFlowAttribute(string name = "",bool scan = true)
{
@@ -82,7 +82,7 @@ namespace Serein.Library
/// <para>如果是Task类型的返回值将会自动进行等待</para>
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class NodeActionAttribute : Attribute
public sealed class NodeActionAttribute : Attribute
{
public NodeActionAttribute(NodeType methodDynamicType,
string methodTips = "",
@@ -113,17 +113,25 @@ namespace Serein.Library
}
/// <summary>
/// 节点参数设置
/// </summary>
[AttributeUsage(AttributeTargets.Parameter)]
public sealed class NodeParamAttribute : Attribute
{
/// <summary>
/// 显示名称
/// </summary>
public string Name;
//[AttributeUsage(AttributeTargets.Field)]
//public class BindTypeAttribute : Attribute
//{
// public Type Type { get; }
/// <summary>
/// 是否显式设置(此设置对于有入参默认值的参数无效)
/// </summary>
public bool IsExplicit;
}
// public BindTypeAttribute(Type type)
// {
// Type = type;
// }
//}
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
public class BindValueAttribute : Attribute
@@ -136,6 +144,8 @@ namespace Serein.Library
}
}
/// <summary>
/// 枚举值转换器要求枚举项标记的BindValueAttribute特性与搭配的参数类型一致否则参数不会传入
/// </summary>

View File

@@ -17,51 +17,11 @@ namespace Serein.Library
[DynamicFlow(Name ="[基础功能]")]
public class SereinBaseFunction
{
//[NodeAction(NodeType.Action,"条件节点")]
//private bool SereinConditionNode(IDynamicContext context,
// object targetObject,
// string exp = "ISPASS")
//{
// var isPass = SereinConditionParser.To(targetObject, exp);
// context.NextOrientation = isPass ? ConnectionInvokeType.IsSucceed : ConnectionInvokeType.IsFail;
// return isPass;
//}
//[NodeAction(NodeType.Action, "表达式节点")]
//private object SereinExpNode(IDynamicContext context,
// object targetObject,
// string exp)
//{
// exp = "@" + exp;
// var newData = SerinExpressionEvaluator.Evaluate(exp, targetObject, out bool isChange);
// object result;
// if (isChange || exp.StartsWith("@GET",System.StringComparison.OrdinalIgnoreCase))
// {
// result = newData;
// }
// else
// {
// result = targetObject;
// }
// context.NextOrientation = ConnectionInvokeType.IsSucceed;
// return result;
//}
[NodeAction(NodeType.Action, "键值对组装")]
private Dictionary<string, object> SereinKvDataCollectionNode(/*NodeModelBase nodeModel, */
string argName,
private Dictionary<string, object> SereinKvDataCollectionNode(string argName,
params object[] value)
{
//var paramsArgIndex = nodeModel.MethodDetails.ParamsArgIndex;
//var pds = nodeModel.MethodDetails.ParameterDetailss;
//var length = pds.Length - paramsArgIndex;
//for(int i = paramsArgIndex; i < pds.Length; i++)
//{
// var pd = pds[i];
//}
var names = argName.Split(';');
var count = Math.Min(value.Length, names.Length);
@@ -90,7 +50,9 @@ namespace Serein.Library
}
[NodeAction(NodeType.Action, "逻辑分支")]
private object SereinLogicalBranch(bool @bool, object t_value,object f_value)
private object SereinLogicalBranch([NodeParam(IsExplicit = false)]bool @bool,
object t_value,
object f_value)
{
return @bool ? t_value : f_value;
}

View File

@@ -267,7 +267,7 @@ public static class NodeMethodDetailsHelper
#endregion
}).ToArray();
foreach(var pd in tempParams)
/* foreach(var pd in tempParams)
{
var argType = pd.DataType;
// 运行环境
@@ -285,9 +285,8 @@ public static class NodeMethodDetailsHelper
{
continue;
}
pd.IsExplicitData = true;
}
}*/
return tempParams;
}
@@ -311,7 +310,26 @@ public static class NodeMethodDetailsHelper
{
dataType = parameterInfo.ParameterType;
}
var description = parameterInfo.GetCustomAttribute<DescriptionAttribute>()?.Description ?? "";
isExplicitData = true;
string description = string.Empty; // 入参描述
var nodeParmsAttribute = parameterInfo.GetCustomAttribute<NodeParamAttribute>();
if(nodeParmsAttribute is not null)
{
if (!parameterInfo.HasDefaultValue)
{
isExplicitData = nodeParmsAttribute.IsExplicit; // 设置是否是显式参数
}
if (string.IsNullOrEmpty(nodeParmsAttribute.Name))
{
description = nodeParmsAttribute.Name; // 设置显示的名称
}
}
else
{
description = parameterInfo.GetCustomAttribute<DescriptionAttribute>()?.Description ?? string.Empty; // 判断是否存在注释特性
}
var inputType = GetInputType(explicitParemType);
var items = GetExplicitItems(explicitParemType, inputType);

View File

@@ -81,11 +81,17 @@ namespace Serein.Workbench.Services
private void InitEvents()
{
flowEEForwardingService.OnProjectLoaded += FlowEEForwardingService_OnProjectLoaded;
flowEEForwardingService.OnProjectSaving += SaveProjectToLocalFile;
flowEEForwardingService.OnEnvOut += FlowEEForwardingService_OnEnvOut;
keyEventService.OnKeyDown += KeyEventService_OnKeyDown; ;
}
private void FlowEEForwardingService_OnProjectLoaded(ProjectLoadedEventArgs eventArgs)
{
}
private void KeyEventService_OnKeyDown(System.Windows.Input.Key key)
{