using Serein.Library.Api; using Serein.Library.Utils; using System; using System.Collections.Generic; using System.Linq; namespace Serein.Library { /// /// 节点入参参数详情 /// [NodeProperty(ValuePath = NodeValuePath.Parameter)] public partial class ParameterDetails { // private readonly IFlowEnvironment env; /// /// 所在的节点 /// [PropertyInfo(IsProtection = true)] private NodeModelBase _nodeModel; /// /// 参数索引 /// [PropertyInfo] private int _index; /// /// 是否为显式参数(固定值/表达式) /// 如果为 true ,则使用UI输入的文本值作为入参数据(过程中会尽可能转为类型需要的数据)。 /// 如果为 false ,则根据 ArgDataSourceType 调用相应节点的GetFlowData()方法,获取返回的数据作为入参数据。 /// [PropertyInfo(IsNotification = true)] private bool _isExplicitData ; ///// ///// 转换器 IEnumConvertor<,> ///// //[PropertyInfo] //private Func _convertor ; /// /// 方法入参若无相关转换器特性标注,则无需关注该变量。该变量用于需要用到枚举BinValue转换器时,指示相应的入参变量需要转为的类型。 /// [PropertyInfo] private Type _explicitType ; /// /// 目前存在三种状态:Select/Bool/Value /// Select : 枚举值/可选值 /// Bool : 布尔类型 /// Value :除以上类型之外的任意参数 /// [PropertyInfo] private string _explicitTypeName ; /// /// 入参数据来源。默认使用上一节点作为入参数据。 /// [PropertyInfo(IsNotification = true)] private ConnectionArgSourceType _argDataSourceType = ConnectionArgSourceType.GetPreviousNodeData; /// /// 当 ArgDataSourceType 不为 GetPreviousNodeData 时(从运行时上一节点获取数据)。 /// 则通过当前上下文,获取该Guid对应的数据作为预处理的入参参数。 /// [PropertyInfo] private string _argDataSourceNodeGuid; /// /// 方法入参需要的类型。 /// [PropertyInfo] private Type _dataType ; /// /// 方法入参参数名称 /// [PropertyInfo] private string _name ; /// /// 自定义的方法入参数据 /// [PropertyInfo(IsNotification = true)] // IsPrint = true private string _dataValue; /// /// 只有当ExplicitTypeName 为 Select 时,才会需要该成员。 /// [PropertyInfo(IsNotification = true)] private string[] _items ; /// /// 指示该属性是可变参数的其中一员(可变参数为数组类型) /// [PropertyInfo] private bool _isParams; } public partial class ParameterDetails { /// /// 用于创建元数据 /// public ParameterDetails() { } /// /// 为节点实例化新的入参描述 /// public ParameterDetails(NodeModelBase nodeModel) { this.NodeModel = nodeModel; } /// /// 通过参数信息加载实体,用于加载项目文件、远程连接的场景 /// /// 参数信息 public ParameterDetails(ParameterDetailsInfo info) { Index = info.Index; Name = info.Name; DataType = Type.GetType(info.DataTypeFullName); ExplicitType = Type.GetType(info.ExplicitTypeFullName); ExplicitTypeName = info.ExplicitTypeName; Items = info.Items; IsParams = info.IsParams; } /// /// 转为描述 /// /// public ParameterDetailsInfo ToInfo() { return new ParameterDetailsInfo { Index = this.Index, IsParams = this.IsParams, DataTypeFullName = this.DataType.FullName, Name = this.Name, ExplicitTypeFullName = this.ExplicitType.FullName, ExplicitTypeName = this.ExplicitTypeName, Items = this.Items.Select(it => it).ToArray(), }; } /// /// 为某个节点从元数据中拷贝方法描述的入参描述 /// /// 对应的节点 /// public ParameterDetails CloneOfModel(NodeModelBase nodeModel) { var pd = new ParameterDetails(nodeModel) { Index = this.Index, IsExplicitData = this.IsExplicitData, ExplicitType = this.ExplicitType, ExplicitTypeName = this.ExplicitTypeName, //Convertor = this.Convertor, DataType = this.DataType, Name = this.Name, DataValue = string.IsNullOrEmpty(DataValue) ? string.Empty : DataValue, Items = this.Items?.Select(it => it).ToArray(), IsParams = this.IsParams, }; return pd; } public override string ToString() { return $"[{this.Index}] {this.Name} : {this.ExplicitType.FullName} -> {this.DataType.FullName}"; } } }