using System;
using System.Collections.Generic;
namespace XericUI.ReflectionUIGenerator
{
///
/// 值范围规则条目
/// 定义某个类型(由 CheckKey 标识)的空/无效/警告/合理值范围
///
[Serializable]
public class AvrgValueRangeEntry
{
///
/// 类型标识符(默认使用 Type.FullName,如 "System.Single", "System.Int32")
/// 也支持自定义字符串以匹配特定语义
///
public string key = "";
// ===== 空值范围 =====
///
/// 是否跳过空值检查(如 bool 类型无法判断空)
///
public bool skipEmptyCheck = false;
///
/// 视为空的最小值(>= 此值视为空)
///
public float emptyRangeMin = float.MinValue;
///
/// 视为空的最大值(<= 此值视为空)
///
public float emptyRangeMax = float.MaxValue;
// ===== 合理值范围(最高优先级) =====
///
/// 合理值最小值
///
public float reasonableRangeMin = float.MinValue;
///
/// 合理值最大值
///
public float reasonableRangeMax = float.MaxValue;
// ===== 无效值范围 =====
///
/// 无效值最小值
///
public float invalidRangeMin = float.MinValue;
///
/// 无效值最大值
///
public float invalidRangeMax = float.MaxValue;
// ===== 警告值范围 =====
///
/// 警告值最小值
///
public float warningRangeMin = float.MinValue;
///
/// 警告值最大值
///
public float warningRangeMax = float.MaxValue;
// ===== 字符串相关 =====
///
/// 警告关键词列表(仅字符串类型使用)
///
public List warningKeywords = new List();
// ===== 便捷判断方法 =====
///
/// 将值转为 float 进行比较(bool→0/1, 数值→直接转, 字符串→长度)
///
public static float ToComparableFloat(object value)
{
if (value == null) return float.NaN;
switch (value)
{
case float f: return f;
case double d: return (float)d;
case int i: return i;
case long l: return l;
case short s: return s;
case byte b: return b;
case uint ui: return ui;
case bool bVal: return bVal ? 1f : 0f;
case string str: return str.Length;
default: return float.NaN;
}
}
///
/// 判断值是否为空
///
public bool IsEmpty(object value)
{
if (skipEmptyCheck) return false;
// 引用类型 null
if (value == null) return true;
// 字符串 null/空
if (value is string str) return string.IsNullOrEmpty(str);
// 数值范围判断
float f = ToComparableFloat(value);
if (float.IsNaN(f)) return false; // 无法判断的类型跳过
return f >= emptyRangeMin && f <= emptyRangeMax;
}
///
/// 判断值是否在合理范围内
///
public bool IsReasonable(object value)
{
float f = ToComparableFloat(value);
if (float.IsNaN(f)) return false;
return f >= reasonableRangeMin && f <= reasonableRangeMax;
}
///
/// 判断值是否在无效范围内
///
public bool IsInvalid(object value)
{
float f = ToComparableFloat(value);
if (float.IsNaN(f)) return false;
return f >= invalidRangeMin && f <= invalidRangeMax;
}
///
/// 判断值是否在警告范围内
///
public bool IsWarning(object value)
{
// 先检查关键词(字符串)
if (value is string str && warningKeywords.Count > 0)
{
foreach (var kw in warningKeywords)
{
if (str.Contains(kw, StringComparison.OrdinalIgnoreCase))
return true;
}
}
// 数值范围
float f = ToComparableFloat(value);
if (float.IsNaN(f)) return false;
return f >= warningRangeMin && f <= warningRangeMax;
}
}
}