using System;
using System.Collections.Generic;
using System.Reflection;
namespace XericUI.ReflectionUIGenerator
{
///
/// 单个成员的元数据数据结构
/// 记录从反射 + Attribute 标记中提取的所有信息
///
public class AvrgMemberMetaData
{
// ============ 反射信息 ============
/// 字段/属性名
public string MemberName { get; set; }
/// 反射信息 (FieldInfo 或 PropertyInfo)
public MemberInfo MemberInfo { get; set; }
/// 值类型
public Type ValueType { get; set; }
/// 是否为属性 (false 为字段)
public bool IsProperty { get; set; }
/// 绑定的目标实例 (可选,Step1 时可空)
public object TargetInstance { get; set; }
// ============ 拆分属性支持 ============
///
/// 子属性路径(仅拆分属性有效)
/// 用于从父值中访问子字段/属性,如 "x"、"y"、"width"
///
public string PropertyPath { get; set; }
///
/// 拆分子元数据列表
/// 由 [XuiavrgSplit] 特性填充,每个子元数据对应一个拆分属性
///
public List SubMetaDataList { get; set; }
// ============ 从 IXuiavrgAttribute 融合的元数据 ============
/// 显示标签
public string LabelName { get; set; }
/// 单位文本
public string UnitLabelName { get; set; }
/// 格式化字符串(如 "{0:F2}")
public string FormatText { get; set; }
/// 功能标记
public XuiavrgFieldTag Tag { get; set; } = XuiavrgFieldTag.None;
/// 标记索引 (同 Tag 多实例时区分)
public int TagIndex { get; set; }
/// 排序值 (越小越靠前)
public int FieldOrder { get; set; }
/// 编组路径 (以 "/" 分割层级)
public string GroupPath { get; set; }
/// 是否在 UI 中隐藏
public bool Hide { get; set; }
/// 值变更时触发的反射调用方法名
public string OnTriggerCall { get; set; }
///
/// 类的初始默认值(由类字段初始化器决定)
/// 例如 public float speed = 10f; → DefaultValue = 10f
///
public object DefaultValue { get; set; }
// ============ 属性检查 (由 [PropertyCheck] 填充) ============
///
/// 判断依据标识
/// 默认使用 ValueType.FullName 与 AvrgValueRangeConfig 中的条目匹配
///
public string PropertyCheckKey { get; set; }
/// 是否必填
public bool Required { get; set; }
/// 是否不可为空
public bool NotEmpty { get; set; }
/// 是否启用合理值范围检查
public bool ValidateReasonable { get; set; }
/// 是否启用警告状态检查
public bool ValidateWarning { get; set; }
/// 是否启用无效值状态检查
public bool ValidateInvalid { get; set; }
// ============ 原始 Attribute 引用 ============
///
/// 收集到的所有 IXuiavrgAttribute 列表
/// 保留原始引用,供扩展和自定义处理使用
///
public List Attributes { get; set; } = new List();
///
/// 从绑定目标获取值
///
public object GetValue()
{
if (TargetInstance == null) return null;
switch (MemberInfo)
{
case PropertyInfo pi:
return pi.GetValue(TargetInstance);
case FieldInfo fi:
return fi.GetValue(TargetInstance);
default:
return null;
}
}
///
/// 设置值到绑定目标
///
public void SetValue(object value)
{
if (TargetInstance == null) return;
switch (MemberInfo)
{
case PropertyInfo pi:
if (pi.CanWrite)
pi.SetValue(TargetInstance, value);
break;
case FieldInfo fi:
fi.SetValue(TargetInstance, value);
break;
}
}
}
}