| using Newtonsoft.Json; | 
| using System; | 
| using System.Collections.Generic; | 
| using System.Data; | 
| using System.Linq; | 
| using System.Reflection; | 
| using System.Text; | 
| using System.Text.RegularExpressions; | 
| using System.Threading.Tasks; | 
| using System.Web; | 
| using WIDESEA_Core.Const; | 
| using WIDESEA_Core.Enums; | 
|   | 
| namespace WIDESEA_Core.Helper | 
| { | 
|     public static class UtilConvert | 
|     { | 
|         private static DateTime dateStart = new DateTime(1970, 1, 1, 8, 0, 0); | 
|   | 
|         private static long longTime = 621355968000000000; | 
|   | 
|         private static int samllTime = 10000000; | 
|         /// <summary> | 
|         /// 时间戳转换成日期 | 
|         /// </summary> | 
|         /// <param name="timeStamp"></param> | 
|         /// <returns></returns> | 
|         public static DateTime GetTimeSpmpToDate(this object timeStamp) | 
|         { | 
|             if (timeStamp == null) return dateStart; | 
|             DateTime dateTime = new DateTime(longTime + Convert.ToInt64(timeStamp) * samllTime, DateTimeKind.Utc).ToLocalTime(); | 
|             return dateTime; | 
|         } | 
|   | 
|         public static string Serialize(this object obj, JsonSerializerSettings formatDate = null) | 
|         { | 
|             if (obj == null) return null; | 
|             formatDate = formatDate ?? new JsonSerializerSettings | 
|             { | 
|                 DateFormatString = "yyyy-MM-dd HH:mm:ss" | 
|             }; | 
|             return JsonConvert.SerializeObject(obj, formatDate); | 
|         } | 
|   | 
|         public static T DeserializeObject<T>(this string json) | 
|         { | 
|             if (string.IsNullOrEmpty(json)) | 
|             { | 
|                 return default(T); | 
|             } | 
|             if (json == "{}") | 
|             { | 
|                 json = "[]"; | 
|             } | 
|             return JsonConvert.DeserializeObject<T>(json); | 
|         } | 
|   | 
|         public static string FirstLetterToLower(this string thisValue) | 
|         { | 
|             if (string.IsNullOrEmpty(thisValue)) return string.Empty; | 
|             string result = thisValue.Substring(0, 1).ToLower() + thisValue.Substring(1, thisValue.Length - 1); | 
|             return result; | 
|         } | 
|   | 
|         public static string FirstLetterToUpper(this string thisValue) | 
|         { | 
|             if (string.IsNullOrEmpty(thisValue)) return string.Empty; | 
|             string result = thisValue.Substring(0, 1).ToUpper() + thisValue.Substring(1, thisValue.Length - 1); | 
|             return result; | 
|         } | 
|   | 
|         /// <summary> | 
|         ///  | 
|         /// </summary> | 
|         /// <param name="thisValue"></param> | 
|         /// <returns></returns> | 
|         public static int ObjToInt(this object thisValue) | 
|         { | 
|             int reval = 0; | 
|             if (thisValue == null) return 0; | 
|             if (thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval)) | 
|             { | 
|                 return reval; | 
|             } | 
|   | 
|             return reval; | 
|         } | 
|   | 
|         /// <summary> | 
|         ///  | 
|         /// </summary> | 
|         /// <param name="thisValue"></param> | 
|         /// <returns></returns> | 
|         public static int DoubleToInt(this double thisValue) | 
|         { | 
|             int reval = 0; | 
|   | 
|             return Convert.ToInt32(thisValue); | 
|         } | 
|   | 
|         /// <summary> | 
|         ///  | 
|         /// </summary> | 
|         /// <param name="thisValue"></param> | 
|         /// <param name="errorValue"></param> | 
|         /// <returns></returns> | 
|         public static int ObjToInt(this object thisValue, int errorValue) | 
|         { | 
|             int reval = 0; | 
|             if (thisValue != null && thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval)) | 
|             { | 
|                 return reval; | 
|             } | 
|   | 
|             return errorValue; | 
|         } | 
|   | 
|         public static long ObjToLong(this object thisValue) | 
|         { | 
|             long reval = 0; | 
|             if (thisValue == null) return 0; | 
|             if (thisValue != DBNull.Value && long.TryParse(thisValue.ToString(), out reval)) | 
|             { | 
|                 return reval; | 
|             } | 
|   | 
|             return reval; | 
|         } | 
|          | 
|         /// <summary> | 
|         ///  | 
|         /// </summary> | 
|         /// <param name="thisValue"></param> | 
|         /// <returns></returns> | 
|         public static double ObjToMoney(this object thisValue) | 
|         { | 
|             double reval = 0; | 
|             if (thisValue != null && thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out reval)) | 
|             { | 
|                 return reval; | 
|             } | 
|   | 
|             return 0; | 
|         } | 
|   | 
|         /// <summary> | 
|         ///  | 
|         /// </summary> | 
|         /// <param name="thisValue"></param> | 
|         /// <param name="errorValue"></param> | 
|         /// <returns></returns> | 
|         public static double ObjToMoney(this object thisValue, double errorValue) | 
|         { | 
|             double reval = 0; | 
|             if (thisValue != null && thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out reval)) | 
|             { | 
|                 return reval; | 
|             } | 
|   | 
|             return errorValue; | 
|         } | 
|   | 
|         /// <summary> | 
|         ///  | 
|         /// </summary> | 
|         /// <param name="thisValue"></param> | 
|         /// <returns></returns> | 
|         public static string ObjToString(this object thisValue) | 
|         { | 
|             if (thisValue != null) return thisValue.ToString().Trim(); | 
|             return ""; | 
|         } | 
|   | 
|         /// <summary> | 
|         ///  | 
|         /// </summary> | 
|         /// <param name="thisValue"></param> | 
|         /// <returns></returns> | 
|         public static bool IsNotEmptyOrNull(this object thisValue) | 
|         { | 
|             return ObjToString(thisValue) != "" && ObjToString(thisValue) != "undefined" && ObjToString(thisValue) != "null"; | 
|         } | 
|   | 
|         /// <summary> | 
|         ///  | 
|         /// </summary> | 
|         /// <param name="thisValue"></param> | 
|         /// <param name="errorValue"></param> | 
|         /// <returns></returns> | 
|         public static string ObjToString(this object thisValue, string errorValue) | 
|         { | 
|             if (thisValue != null) return thisValue.ToString().Trim(); | 
|             return errorValue; | 
|         } | 
|   | 
|         public static bool IsNullOrEmpty(this object thisValue) => thisValue == null || thisValue == DBNull.Value || string.IsNullOrWhiteSpace(thisValue.ToString()); | 
|   | 
|         /// <summary> | 
|         ///  | 
|         /// </summary> | 
|         /// <param name="thisValue"></param> | 
|         /// <returns></returns> | 
|         public static Decimal ObjToDecimal(this object thisValue) | 
|         { | 
|             Decimal reval = 0; | 
|             if (thisValue != null && thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out reval)) | 
|             { | 
|                 return reval; | 
|             } | 
|   | 
|             return 0; | 
|         } | 
|   | 
|         /// <summary> | 
|         ///  | 
|         /// </summary> | 
|         /// <param name="thisValue"></param> | 
|         /// <param name="errorValue"></param> | 
|         /// <returns></returns> | 
|         public static Decimal ObjToDecimal(this object thisValue, decimal errorValue) | 
|         { | 
|             Decimal reval = 0; | 
|             if (thisValue != null && thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out reval)) | 
|             { | 
|                 return reval; | 
|             } | 
|   | 
|             return errorValue; | 
|         } | 
|   | 
|         /// <summary> | 
|         ///  | 
|         /// </summary> | 
|         /// <param name="thisValue"></param> | 
|         /// <returns></returns> | 
|         public static DateTime ObjToDate(this object thisValue) | 
|         { | 
|             DateTime reval = DateTime.MinValue; | 
|             if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval)) | 
|             { | 
|                 reval = Convert.ToDateTime(thisValue); | 
|             } | 
|   | 
|             return reval; | 
|         } | 
|   | 
|         /// <summary> | 
|         ///  | 
|         /// </summary> | 
|         /// <param name="thisValue"></param> | 
|         /// <param name="errorValue"></param> | 
|         /// <returns></returns> | 
|         public static DateTime ObjToDate(this object thisValue, DateTime errorValue) | 
|         { | 
|             DateTime reval = DateTime.MinValue; | 
|             if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval)) | 
|             { | 
|                 return reval; | 
|             } | 
|   | 
|             return errorValue; | 
|         } | 
|   | 
|         /// <summary> | 
|         ///  | 
|         /// </summary> | 
|         /// <param name="thisValue"></param> | 
|         /// <returns></returns> | 
|         public static bool ObjToBool(this object thisValue) | 
|         { | 
|             bool reval = false; | 
|             if (thisValue != null && thisValue != DBNull.Value && bool.TryParse(thisValue.ToString(), out reval)) | 
|             { | 
|                 return reval; | 
|             } | 
|   | 
|             return reval; | 
|         } | 
|   | 
|   | 
|         /// <summary> | 
|         /// 获取当前时间的时间戳 | 
|         /// </summary> | 
|         /// <param name="thisValue"></param> | 
|         /// <returns></returns> | 
|         public static string DateToTimeStamp(this DateTime thisValue) | 
|         { | 
|             TimeSpan ts = thisValue - new DateTime(1970, 1, 1, 0, 0, 0, 0); | 
|             return Convert.ToInt64(ts.TotalSeconds).ToString(); | 
|         } | 
|   | 
|         public static object ChangeType(this object value, Type type) | 
|         { | 
|             if (value == null && type.IsGenericType) return Activator.CreateInstance(type); | 
|             if (value == null) return null; | 
|             if (type == value.GetType()) return value; | 
|             if (type.IsEnum) | 
|             { | 
|                 if (value is string) | 
|                     return Enum.Parse(type, value as string); | 
|                 else | 
|                     return Enum.ToObject(type, value); | 
|             } | 
|   | 
|             if (!type.IsInterface && type.IsGenericType) | 
|             { | 
|                 Type innerType = type.GetGenericArguments()[0]; | 
|                 object innerValue = ChangeType(value, innerType); | 
|                 return Activator.CreateInstance(type, new object[] { innerValue }); | 
|             } | 
|   | 
|             if (value is string && type == typeof(Guid)) return new Guid(value as string); | 
|             if (value is string && type == typeof(Version)) return new Version(value as string); | 
|             if (!(value is IConvertible)) return value; | 
|             return Convert.ChangeType(value, type); | 
|         } | 
|   | 
|         public static object ChangeTypeList(this object value, Type type) | 
|         { | 
|             if (value == null) return default; | 
|   | 
|             var gt = typeof(List<>).MakeGenericType(type); | 
|             dynamic lis = Activator.CreateInstance(gt); | 
|   | 
|             var addMethod = gt.GetMethod("Add"); | 
|             string values = value.ToString(); | 
|             if (values != null && values.StartsWith("(") && values.EndsWith(")")) | 
|             { | 
|                 string[] splits; | 
|                 if (values.Contains("\",\"")) | 
|                 { | 
|                     splits = values.Remove(values.Length - 2, 2) | 
|                         .Remove(0, 2) | 
|                         .Split("\",\""); | 
|                 } | 
|                 else | 
|                 { | 
|                     splits = values.Remove(0, 1) | 
|                         .Remove(values.Length - 2, 1) | 
|                         .Split(","); | 
|                 } | 
|   | 
|                 foreach (var split in splits) | 
|                 { | 
|                     var str = split; | 
|                     if (split.StartsWith("\"") && split.EndsWith("\"")) | 
|                     { | 
|                         str = split.Remove(0, 1) | 
|                             .Remove(split.Length - 2, 1); | 
|                     } | 
|   | 
|                     addMethod.Invoke(lis, new object[] { ChangeType(str, type) }); | 
|                 } | 
|             } | 
|   | 
|             return lis; | 
|         } | 
|   | 
|         public static string ToJson(this object value) | 
|         { | 
|             return JsonConvert.SerializeObject(value); | 
|         } | 
|   | 
|         public static bool IsInt(this object obj) | 
|         { | 
|             if (obj == null) | 
|                 return false; | 
|             bool reslut = Int32.TryParse(obj.ToString(), out int _number); | 
|             return reslut; | 
|   | 
|         } | 
|         public static bool IsDate(this object str) | 
|         { | 
|             return str.IsDate(out _); | 
|         } | 
|         public static bool IsDate(this object str, out DateTime dateTime) | 
|         { | 
|             dateTime = DateTime.Now; | 
|             if (str == null || str.ToString() == "") | 
|             { | 
|                 return false; | 
|             } | 
|             return DateTime.TryParse(str.ToString(), out dateTime); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 根据传入格式判断是否为小数 | 
|         /// </summary> | 
|         /// <param name="str"></param> | 
|         /// <param name="formatString">18,5</param> | 
|         /// <returns></returns> | 
|         public static bool IsNumber(this string str, string formatString) | 
|         { | 
|             if (string.IsNullOrEmpty(str)) return false; | 
|   | 
|             return Regex.IsMatch(str, @"^[+-]?\d*[.]?\d*$"); | 
|         } | 
|   | 
|         public static bool IsGuid(this string guid) | 
|         { | 
|             Guid newId; | 
|             return guid.GetGuid(out newId); | 
|         } | 
|   | 
|         public static bool GetGuid(this string guid, out Guid outId) | 
|         { | 
|             Guid emptyId = Guid.Empty; | 
|             return Guid.TryParse(guid, out outId); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 转换为短整型 qy 2024-7-15 | 
|         /// </summary> | 
|         /// <param name="data">数据</param> | 
|         public static short ToShort(this object data) | 
|         { | 
|             if (data == null) | 
|                 return 0; | 
|             short result; | 
|             var success = short.TryParse(data.ToString(), out result); | 
|             if (success) | 
|                 return result; | 
|             try | 
|             { | 
|                 return Convert.ToInt16(data); | 
|             } | 
|             catch (Exception) | 
|             { | 
|                 return 0; | 
|             } | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 转换为高精度浮点数,并按指定的小数位4舍5入 qy 2024-7-15 | 
|         /// </summary> | 
|         /// <param name="data">数据</param> | 
|         /// <param name="digits">小数位数</param> | 
|         public static decimal ToDecimal(this object data, int digits) | 
|         { | 
|             return Math.Round(ObjToDecimal(data), digits); | 
|         } | 
|   | 
|         | 
|   | 
|         /// <summary> | 
|         /// 枚举转List qy 2024-7-15 | 
|         /// </summary> | 
|         /// <typeparam name="T"></typeparam> | 
|         /// <returns></returns> | 
|         public static List<object> GetEnumList<T>() | 
|         { | 
|             List<object> list = new List<object>(); | 
|             var t = typeof(T); | 
|             foreach (var item in Enum.GetValues(typeof(T))) | 
|             { | 
|                 FieldInfo f = t.GetField(Enum.GetName(typeof(T), item)); | 
|                 var r = (System.ComponentModel.DescriptionAttribute[])f.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false); | 
|                 list.Add(new { ID = item, value = Enum.GetName(typeof(T), item), name = r[0].Description }); | 
|             } | 
|             return list; | 
|         } | 
|   | 
|         /// <summary>  | 
|         /// 验证动态类型元素是否为空 qy 2024-7-15 | 
|         /// </summary> | 
|         /// <param name="obj"></param> | 
|         /// <returns></returns> | 
|         public static bool CheckDynamic(object obj) | 
|         { | 
|             return (obj != null && Convert.ToString(obj) != "") ? true : false; | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 动态类型元素转字符串并解码 qy 2024-7-15 | 
|         /// </summary> | 
|         /// <param name="obj"></param> | 
|         /// <returns></returns> | 
|         public static string DynamicToString(object obj) | 
|         { | 
|             return CheckDynamic(obj) ? HttpUtility.UrlDecode(Convert.ToString(obj).Trim()) : ""; | 
|         } | 
|   | 
|         /// <summary>  | 
|         /// DataTable转为json  qy 2024-7-15 | 
|         /// </summary>  | 
|         /// <param name="parObjRefDataTable">DataTable</param>  | 
|         /// <returns>json数据</returns>  | 
|         public static string ToJson(this DataTable parObjRefDataTable) | 
|         { | 
|             List<object> objArrList = new List<object>(); | 
|   | 
|             foreach (DataRow objDataRow in parObjRefDataTable.Rows) | 
|             { | 
|                 Dictionary<string, object> objResult = new Dictionary<string, object>(); | 
|   | 
|                 foreach (DataColumn objDataColumn in parObjRefDataTable.Columns) | 
|                     objResult.Add(objDataColumn.ColumnName, objDataRow[objDataColumn].ToString()); | 
|   | 
|                 objArrList.Add(objResult); | 
|             } | 
|   | 
|             return ToJson(objArrList); | 
|         } | 
|         /// <summary> | 
|         /// Json转List qy 2024-7-15 | 
|         /// </summary> | 
|         /// <typeparam name="T"></typeparam> | 
|         /// <param name="parJson"></param> | 
|         /// <returns></returns> | 
|         public static List<T> JsonToList<T>(this string parJson) | 
|         { | 
|             if (string.IsNullOrWhiteSpace(parJson)) | 
|             { | 
|                 return new List<T>(); | 
|             } | 
|             else | 
|             { | 
|                 return JsonConvert.DeserializeObject<List<T>>(parJson); | 
|             } | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 日期转为unix值 | 
|         /// </summary> | 
|         /// <param name="dt"></param> | 
|         /// <param name="utc">T:按UTC时间计算(默认);F:按本地时间计算</param> | 
|         /// <returns></returns> | 
|         public static double ToUnix(this DateTime dt, bool utc = true) | 
|         { | 
|             double intResult = 0; | 
|             System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); | 
|             intResult = (dt - startTime).TotalSeconds; | 
|             intResult = Math.Round(intResult, 0); | 
|             return intResult; | 
|         } | 
|   | 
|         #region 判断是否为字符串 qy 2024-7-15 | 
|         /// <summary> | 
|         /// 判断字符串是否为合法的json字符串 qy 2024-7-15 | 
|         /// </summary> | 
|         /// <param name="json"></param> | 
|         /// <returns></returns> | 
|         public static bool IsJson(string json) | 
|         { | 
|             int errIndex; | 
|             return IsJson(json, out errIndex); | 
|         } | 
|         public static bool IsJson(string json, out int errIndex) | 
|         { | 
|             errIndex = 0; | 
|             if (IsJsonStart(ref json)) | 
|             { | 
|                 CharState cs = new CharState(); | 
|                 char c; | 
|                 for (int i = 0; i < json.Length; i++) | 
|                 { | 
|                     c = json[i]; | 
|                     if (SetCharState(c, ref cs) && cs.childrenStart)//设置关键符号状态。 | 
|                     { | 
|                         string item = json.Substring(i); | 
|                         int err; | 
|                         int length = GetValueLength(item, true, out err); | 
|                         cs.childrenStart = false; | 
|                         if (err > 0) | 
|                         { | 
|                             errIndex = i + err; | 
|                             return false; | 
|                         } | 
|                         i = i + length - 1; | 
|                     } | 
|                     if (cs.isError) | 
|                     { | 
|                         errIndex = i; | 
|                         return false; | 
|                     } | 
|                 } | 
|   | 
|                 return !cs.arrayStart && !cs.jsonStart; | 
|             } | 
|             return false; | 
|         } | 
|   | 
|         private static bool IsJsonStart(ref string json) | 
|         { | 
|             if (!string.IsNullOrEmpty(json)) | 
|             { | 
|                 json = json.Trim('\r', '\n', ' '); | 
|                 if (json.Length > 1) | 
|                 { | 
|                     char s = json[0]; | 
|                     char e = json[json.Length - 1]; | 
|                     return (s == '{' && e == '}') || (s == '[' && e == ']'); | 
|                 } | 
|             } | 
|             return false; | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 获取值的长度(当Json值嵌套以"{"或"["开头时) qy 2024-7-15 | 
|         /// </summary> | 
|         private static int GetValueLength(string json, bool breakOnErr, out int errIndex) | 
|         { | 
|             errIndex = 0; | 
|             int len = 0; | 
|             if (!string.IsNullOrEmpty(json)) | 
|             { | 
|                 CharState cs = new CharState(); | 
|                 char c; | 
|                 for (int i = 0; i < json.Length; i++) | 
|                 { | 
|                     c = json[i]; | 
|                     if (!SetCharState(c, ref cs))//设置关键符号状态。 | 
|                     { | 
|                         if (!cs.jsonStart && !cs.arrayStart)//json结束,又不是数组,则退出。 | 
|                         { | 
|                             break; | 
|                         } | 
|                     } | 
|                     else if (cs.childrenStart)//正常字符,值状态下。 | 
|                     { | 
|                         int length = GetValueLength(json.Substring(i), breakOnErr, out errIndex);//递归子值,返回一个长度。。。 | 
|                         cs.childrenStart = false; | 
|                         cs.valueStart = 0; | 
|                         //cs.state = 0; | 
|                         i = i + length - 1; | 
|                     } | 
|                     if (breakOnErr && cs.isError) | 
|                     { | 
|                         errIndex = i; | 
|                         return i; | 
|                     } | 
|                     if (!cs.jsonStart && !cs.arrayStart)//记录当前结束位置。 | 
|                     { | 
|                         len = i + 1;//长度比索引+1 | 
|                         break; | 
|                     } | 
|                 } | 
|             } | 
|             return len; | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 字符状态 qy 2024-7-15 | 
|         /// </summary> | 
|         private class CharState | 
|         { | 
|             internal bool jsonStart = false;//以 "{"开始了... | 
|             internal bool setDicValue = false;// 可以设置字典值了。 | 
|             internal bool escapeChar = false;//以"\"转义符号开始了 | 
|             /// <summary> | 
|             /// 数组开始【仅第一开头才算】,值嵌套的以【childrenStart】来标识。 | 
|             /// </summary> | 
|             internal bool arrayStart = false;//以"[" 符号开始了 | 
|             internal bool childrenStart = false;//子级嵌套开始了。 | 
|             /// <summary> | 
|             /// 【0 初始状态,或 遇到“,”逗号】;【1 遇到“:”冒号】 | 
|             /// </summary> | 
|             internal int state = 0; | 
|   | 
|             /// <summary> | 
|             /// 【-1 取值结束】【0 未开始】【1 无引号开始】【2 单引号开始】【3 双引号开始】 | 
|             /// </summary> | 
|             internal int keyStart = 0; | 
|             /// <summary> | 
|             /// 【-1 取值结束】【0 未开始】【1 无引号开始】【2 单引号开始】【3 双引号开始】 | 
|             /// </summary> | 
|             internal int valueStart = 0; | 
|             internal bool isError = false;//是否语法错误。 | 
|   | 
|             internal void CheckIsError(char c)//只当成一级处理(因为GetLength会递归到每一个子项处理) | 
|             { | 
|                 if (keyStart > 1 || valueStart > 1) | 
|                 { | 
|                     return; | 
|                 } | 
|                 //示例 ["aa",{"bbbb":123,"fff","ddd"}]  | 
|                 switch (c) | 
|                 { | 
|                     case '{'://[{ "[{A}]":[{"[{B}]":3,"m":"C"}]}] | 
|                         isError = jsonStart && state == 0;//重复开始错误 同时不是值处理。 | 
|                         break; | 
|                     case '}': | 
|                         isError = !jsonStart || (keyStart != 0 && state == 0);//重复结束错误 或者 提前结束{"aa"}。正常的有{} | 
|                         break; | 
|                     case '[': | 
|                         isError = arrayStart && state == 0;//重复开始错误 | 
|                         break; | 
|                     case ']': | 
|                         isError = !arrayStart || jsonStart;//重复开始错误 或者 Json 未结束 | 
|                         break; | 
|                     case '"': | 
|                     case '\'': | 
|                         isError = !(jsonStart || arrayStart); //json 或数组开始。 | 
|                         if (!isError) | 
|                         { | 
|                             //重复开始 [""",{"" "}] | 
|                             isError = (state == 0 && keyStart == -1) || (state == 1 && valueStart == -1); | 
|                         } | 
|                         if (!isError && arrayStart && !jsonStart && c == '\'')//['aa',{}] | 
|                         { | 
|                             isError = true; | 
|                         } | 
|                         break; | 
|                     case ':': | 
|                         isError = !jsonStart || state == 1;//重复出现。 | 
|                         break; | 
|                     case ',': | 
|                         isError = !(jsonStart || arrayStart); //json 或数组开始。 | 
|                         if (!isError) | 
|                         { | 
|                             if (jsonStart) | 
|                             { | 
|                                 isError = state == 0 || (state == 1 && valueStart > 1);//重复出现。 | 
|                             } | 
|                             else if (arrayStart)//["aa,] [,]  [{},{}] | 
|                             { | 
|                                 isError = keyStart == 0 && !setDicValue; | 
|                             } | 
|                         } | 
|                         break; | 
|                     case ' ': | 
|                     case '\r': | 
|                     case '\n'://[ "a",\r\n{} ] | 
|                     case '\0': | 
|                     case '\t': | 
|                         break; | 
|                     default: //值开头。。 | 
|                         isError = (!jsonStart && !arrayStart) || (state == 0 && keyStart == -1) || (valueStart == -1 && state == 1);// | 
|                         break; | 
|                 } | 
|                 //if (isError) | 
|                 //{ | 
|   | 
|                 //} | 
|             } | 
|         } | 
|         /// <summary> | 
|         /// 设置字符状态(返回true则为关键词,返回false则当为普通字符处理) qy 2024-7-15 | 
|         /// </summary> | 
|         private static bool SetCharState(char c, ref CharState cs) | 
|         { | 
|             cs.CheckIsError(c); | 
|             switch (c) | 
|             { | 
|                 case '{'://[{ "[{A}]":[{"[{B}]":3,"m":"C"}]}] | 
|                     #region 大括号 | 
|                     if (cs.keyStart <= 0 && cs.valueStart <= 0) | 
|                     { | 
|                         cs.keyStart = 0; | 
|                         cs.valueStart = 0; | 
|                         if (cs.jsonStart && cs.state == 1) | 
|                         { | 
|                             cs.childrenStart = true; | 
|                         } | 
|                         else | 
|                         { | 
|                             cs.state = 0; | 
|                         } | 
|                         cs.jsonStart = true;//开始。 | 
|                         return true; | 
|                     } | 
|                     #endregion | 
|                     break; | 
|                 case '}': | 
|                     #region 大括号结束 | 
|                     if (cs.keyStart <= 0 && cs.valueStart < 2 && cs.jsonStart) | 
|                     { | 
|                         cs.jsonStart = false;//正常结束。 | 
|                         cs.state = 0; | 
|                         cs.keyStart = 0; | 
|                         cs.valueStart = 0; | 
|                         cs.setDicValue = true; | 
|                         return true; | 
|                     } | 
|                     // cs.isError = !cs.jsonStart && cs.state == 0; | 
|                     #endregion | 
|                     break; | 
|                 case '[': | 
|                     #region 中括号开始 | 
|                     if (!cs.jsonStart) | 
|                     { | 
|                         cs.arrayStart = true; | 
|                         return true; | 
|                     } | 
|                     else if (cs.jsonStart && cs.state == 1) | 
|                     { | 
|                         cs.childrenStart = true; | 
|                         return true; | 
|                     } | 
|                     #endregion | 
|                     break; | 
|                 case ']': | 
|                     #region 中括号结束 | 
|                     if (cs.arrayStart && !cs.jsonStart && cs.keyStart <= 2 && cs.valueStart <= 0)//[{},333]//这样结束。 | 
|                     { | 
|                         cs.keyStart = 0; | 
|                         cs.valueStart = 0; | 
|                         cs.arrayStart = false; | 
|                         return true; | 
|                     } | 
|                     #endregion | 
|                     break; | 
|                 case '"': | 
|                 case '\'': | 
|                     #region 引号 | 
|                     if (cs.jsonStart || cs.arrayStart) | 
|                     { | 
|                         if (cs.state == 0)//key阶段,有可能是数组["aa",{}] | 
|                         { | 
|                             if (cs.keyStart <= 0) | 
|                             { | 
|                                 cs.keyStart = (c == '"' ? 3 : 2); | 
|                                 return true; | 
|                             } | 
|                             else if ((cs.keyStart == 2 && c == '\'') || (cs.keyStart == 3 && c == '"')) | 
|                             { | 
|                                 if (!cs.escapeChar) | 
|                                 { | 
|                                     cs.keyStart = -1; | 
|                                     return true; | 
|                                 } | 
|                                 else | 
|                                 { | 
|                                     cs.escapeChar = false; | 
|                                 } | 
|                             } | 
|                         } | 
|                         else if (cs.state == 1 && cs.jsonStart)//值阶段必须是Json开始了。 | 
|                         { | 
|                             if (cs.valueStart <= 0) | 
|                             { | 
|                                 cs.valueStart = (c == '"' ? 3 : 2); | 
|                                 return true; | 
|                             } | 
|                             else if ((cs.valueStart == 2 && c == '\'') || (cs.valueStart == 3 && c == '"')) | 
|                             { | 
|                                 if (!cs.escapeChar) | 
|                                 { | 
|                                     cs.valueStart = -1; | 
|                                     return true; | 
|                                 } | 
|                                 else | 
|                                 { | 
|                                     cs.escapeChar = false; | 
|                                 } | 
|                             } | 
|   | 
|                         } | 
|                     } | 
|                     #endregion | 
|                     break; | 
|                 case ':': | 
|                     #region 冒号 | 
|                     if (cs.jsonStart && cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 0) | 
|                     { | 
|                         if (cs.keyStart == 1) | 
|                         { | 
|                             cs.keyStart = -1; | 
|                         } | 
|                         cs.state = 1; | 
|                         return true; | 
|                     } | 
|                     // cs.isError = !cs.jsonStart || (cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 1); | 
|                     #endregion | 
|                     break; | 
|                 case ',': | 
|                     #region 逗号 //["aa",{aa:12,}] | 
|   | 
|                     if (cs.jsonStart) | 
|                     { | 
|                         if (cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 1) | 
|                         { | 
|                             cs.state = 0; | 
|                             cs.keyStart = 0; | 
|                             cs.valueStart = 0; | 
|                             //if (cs.valueStart == 1) | 
|                             //{ | 
|                             //    cs.valueStart = 0; | 
|                             //} | 
|                             cs.setDicValue = true; | 
|                             return true; | 
|                         } | 
|                     } | 
|                     else if (cs.arrayStart && cs.keyStart <= 2) | 
|                     { | 
|                         cs.keyStart = 0; | 
|                         //if (cs.keyStart == 1) | 
|                         //{ | 
|                         //    cs.keyStart = -1; | 
|                         //} | 
|                         return true; | 
|                     } | 
|                     #endregion | 
|                     break; | 
|                 case ' ': | 
|                 case '\r': | 
|                 case '\n'://[ "a",\r\n{} ] | 
|                 case '\0': | 
|                 case '\t': | 
|                     if (cs.keyStart <= 0 && cs.valueStart <= 0) //cs.jsonStart &&  | 
|                     { | 
|                         return true;//跳过空格。 | 
|                     } | 
|                     break; | 
|                 default: //值开头。。 | 
|                     if (c == '\\') //转义符号 | 
|                     { | 
|                         if (cs.escapeChar) | 
|                         { | 
|                             cs.escapeChar = false; | 
|                         } | 
|                         else | 
|                         { | 
|                             cs.escapeChar = true; | 
|                             return true; | 
|                         } | 
|                     } | 
|                     else | 
|                     { | 
|                         cs.escapeChar = false; | 
|                     } | 
|                     if (cs.jsonStart || cs.arrayStart) // Json 或数组开始了。 | 
|                     { | 
|                         if (cs.keyStart <= 0 && cs.state == 0) | 
|                         { | 
|                             cs.keyStart = 1;//无引号的 | 
|                         } | 
|                         else if (cs.valueStart <= 0 && cs.state == 1 && cs.jsonStart)//只有Json开始才有值。 | 
|                         { | 
|                             cs.valueStart = 1;//无引号的 | 
|                         } | 
|                     } | 
|                     break; | 
|             } | 
|             return false; | 
|         } | 
|   | 
|         #endregion | 
|   | 
|         public static LinqExpressionType GetLinqCondition(this string stringType) | 
|         { | 
|             LinqExpressionType linqExpression; | 
|             switch (stringType) | 
|             { | 
|                 case HtmlElementType.Contains: | 
|                     linqExpression = LinqExpressionType.In; | 
|                     break; | 
|                 case HtmlElementType.ThanOrEqual: | 
|                     linqExpression = LinqExpressionType.ThanOrEqual; | 
|                     break; | 
|                 case HtmlElementType.LessOrequal: | 
|                     linqExpression = LinqExpressionType.LessThanOrEqual; | 
|                     break; | 
|                 case HtmlElementType.GT: | 
|                     linqExpression = LinqExpressionType.GreaterThan; | 
|                     break; | 
|                 case HtmlElementType.lt: | 
|                     linqExpression = LinqExpressionType.LessThan; | 
|                     break; | 
|                 case HtmlElementType.like: | 
|                     linqExpression = LinqExpressionType.Contains; | 
|                     break; | 
|                 default: | 
|                     linqExpression = LinqExpressionType.Equal; | 
|                     break; | 
|             } | 
|             return linqExpression; | 
|         } | 
|     } | 
| } |