using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Serein.Library { /// /// 用来判断该方法属于什么节点,使运行环境决定方法的运行逻辑 /// public enum NodeType { /// /// 初始化,流程启动时执行(不生成节点) /// 可以异步等待 /// Init, /// /// 开始载入,流程启动时执行(不生成节点) /// 可以异步等待 /// Loading, /// /// 结束,流程结束时执行(不生成节点) /// 可以异步等待 /// Exit, /// /// UI节点(每个节点只会执行一次对应的方法) /// 需要返回IEmbeddedContent接口 /// IEmbeddedContent接口实现由你决定 /// UI, /// /// 触发器节点,必须为标记在可异步等待的方法,建议与继承了 FlowTriggerk<TEnum> 的实例对象搭配使用 /// 方法返回值必须为Task<IFlipflopContext<TResult>>,若为其它返回值,将不会创建节点。 /// 触发器根据在分支中的位置,分为两种类型:流程分支中的触发器、全局触发器 /// 一般的触发器:存在于分支某处,也可能是分支的终点,但一定不是流程的起点与分支的起点。 /// 一般的触发器行为:在当前分支中执行一次之后不再执行,一般用于等待某个操作的响应。 /// 一般的触发器入参:如果使用了 FlowTriggerk<TEnum> ,就会至少有一个枚举类型的参数,参数类型与 TEnum 泛型一致。 /// 全局触发器:没有上游分支、同时并非流程的起始节点。 /// 全局触发器行为:全局触发器会循环执行,直到流程结束。 /// 一般的触发器入参:如果使用了 FlowTriggerk<TEnum> ,就会至少有一个枚举类型的参数,参数类型与 TEnum 泛型一致。 /// Flipflop, /// /// 动作节点,可以异步等待 /// 如果不显式的设置入参数据(例如文本、@Get取值表达式),就会默认使用该节点的运行时上一个节点的数据。 /// 假如上一节点是某个对象,但入参需要的是对象中某个属性/字段,则建议使用取值表达式、表达式节点获取所需要的数据。 /// 关于@Get取值表达式的使用方法: /// public class UserInfo /// { /// public string Name; // 取值表达式:@Get .Name /// public string[] PhoneNums; // 获取第1项的取值表达式:@Get .PhoneNums[0] /// } /// 取值表达式可以符合直觉的如此获取实例成员:@Get .Data.Array[2].Data...... /// 格式说明:@Get大小写不敏感,然后空一格,需要标记“.”,然后才是获取成员名称(成员名称大小写敏感)。 /// Action, } class UserInfo { public string Name; public int Id; public string[] PhoneNums; } /// /// 生成的节点控件 /// public enum NodeControlType { /// /// 预料之外的情况 /// None, /// /// 动作节点 /// Action, /// /// 触发器节点 /// Flipflop, /// /// UI节点 /// UI, /// /// 表达式操作节点 /// [Description("base")] ExpOp, /// /// 表达式操作节点 /// [Description("base")] ExpCondition, /// /// 条件节点区域 /// [Description("base")] ConditionRegion, /// /// 全局数据 /// [Description("base")] GlobalData, /// /// 脚本节点 /// [Description("base")] Script, } }