using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Kean.Domain.Order.Models { /// /// 单号格式 /// public class Format { private readonly IEnumerable _span; // 片段 /// /// 初始化 Kean.Domain.Order.Models.Format 类的新实例 /// /// 片段 public Format(IEnumerable span) => _span = span; /// /// 隐式转换为字符串 /// /// 格式 public static implicit operator string(Format format) => format.ToString(); /* * 重写 System.ToString 方法,实现片段到字符串的转换 */ public override string ToString() => string.Join(string.Empty, _span.Select(i => { var parts = i.Split(':', 2); return parts[0] switch { "const" => parts[1], "date" or "serial" => $"{{{parts[0]}:{parts[1]}}}", _ => null, }; })); /// /// 解释片段 /// /// 格式 /// 片段 public static IEnumerable<(string Type, string Value)> Interpret(string format) { var span = new Stack(); bool? flag = null; foreach (var @char in format) { switch (@char) { case '{': span.Push(new StringBuilder[2] { new(), new() }); flag = false; break; case ':': flag = true; break; case '}': flag = null; break; default: switch (flag) { case false: span.Peek()[0].Append(@char); break; case true: span.Peek()[1].Append(@char); break; case null: span.Push(new StringBuilder[2] { new("const"), new(@char.ToString()) }); flag = true; break; } break; } } return span .Reverse() .Select(a => (a[0].ToString(), a[1].ToString())) .ToArray(); } } }