优化反射绑定

This commit is contained in:
2026-07-24 14:51:03 +08:00
parent e63f1fb000
commit 39220c761f
9 changed files with 195 additions and 122 deletions
@@ -4,12 +4,21 @@ namespace XericUI.ReflectionUIGenerator
{
/// <summary>
/// 字段编组特性
/// 将多个字段标记为属于同一个 Entry,共享一个 UI 组件实例
/// 将多个字段标记为属于同一个编组路径,共享一个 UI 组件实例
///
/// 编组不携带 Tag,Tag 由 [XuiavrgFieldTag] 单独标记。
/// 使用示例:
/// [XuiavrgFieldEntryGroup("field1", XuiavrgFieldTag.Label)] public string fieldLabel = "速度";
/// [XuiavrgFieldEntryGroup("field1", XuiavrgFieldTag.Context)] public float fieldValue = 0.1f;
/// [XuiavrgFieldEntryGroup("field1", XuiavrgFieldTag.Unit)] public string fieldUnit = "m/s";
/// [XuiavrgFieldEntryGroup("field1")]
/// [XuiavrgFieldTag(XuiavrgFieldTag.Label)]
/// public string fieldLabel = "速度";
///
/// [XuiavrgFieldEntryGroup("field1")]
/// [XuiavrgFieldTag(XuiavrgFieldTag.Context)]
/// public float fieldValue = 0.1f;
///
/// [XuiavrgFieldEntryGroup("field1")]
/// [XuiavrgFieldTag(XuiavrgFieldTag.Unit)]
/// public string fieldUnit = "m/s";
///
/// 上述三个字段将合并为一个 Entry,分别绑定到 UI 组件上 Label、Context、Unit 三个子元素
/// </summary>
@@ -18,31 +27,20 @@ namespace XericUI.ReflectionUIGenerator
{
/// <summary>编组路径,以 "/" 分割层级。同一 groupPath 的字段合并到一个 Entry</summary>
public readonly string GroupPath;
/// <summary>该字段在编组 Entry 中的功能标记</summary>
public readonly XuiavrgFieldTag Tag;
/// <summary>同一 Tag 存在多个时的索引区分</summary>
public readonly int TagIndex;
/// <summary>
/// 创建字段编组标记
/// </summary>
/// <param name="groupPath">编组路径 (如 "field1" 或 "field1/child")</param>
/// <param name="tag">功能标记</param>
/// <param name="tagIndex">标记索引 (同一 Tag 存在多个时区分)</param>
public XuiavrgFieldEntryGroupAttribute(string groupPath, XuiavrgFieldTag tag, int tagIndex = 0)
/// <param name="groupPath">编组路径 (如 "field1" 或 "Stats/Speed")</param>
public XuiavrgFieldEntryGroupAttribute(string groupPath)
{
GroupPath = groupPath;
Tag = tag;
TagIndex = tagIndex;
}
public void BindMetaData(AvrgMemberMetaData metaData)
{
metaData.GroupPath = GroupPath;
metaData.Tag = Tag;
metaData.TagIndex = TagIndex;
// 不设置 Tag/TagIndex,留给 [XuiavrgFieldTag] 单独处理
}
}
}
@@ -12,7 +12,7 @@ namespace XericUI.ReflectionUIGenerator
/// Manager 在 GenerateUI 阶段会优先使用此名称查找 PropertyGroup
/// </summary>
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public class XuiavrgFieldPrefabOverrideAttribute : Attribute, IXuiavrgAttribute
public class XuiavrgFieldNameAttribute : Attribute, IXuiavrgAttribute
{
/// <summary>覆盖的预制体组名称</summary>
public readonly string PrefabGroupName;
@@ -23,7 +23,7 @@ namespace XericUI.ReflectionUIGenerator
/// <param name="prefabGroupName">
/// 目标预制体名称,在 AvrgTypePrefabMappingConfig 中查找匹配
/// </param>
public XuiavrgFieldPrefabOverrideAttribute(string prefabGroupName)
public XuiavrgFieldNameAttribute(string prefabGroupName)
{
PrefabGroupName = prefabGroupName;
}
@@ -0,0 +1,44 @@
using System;
namespace XericUI.ReflectionUIGenerator
{
/// <summary>
/// 字段功能标记特性
/// 单独设置字段的功能标记,与编组分离
///
/// 使用示例:
/// [XuiavrgFieldEntryGroup("field1")]
/// [XuiavrgFieldTag(XuiavrgFieldTag.Label)]
/// public string fieldLabel = "速度";
///
/// [XuiavrgFieldEntryGroup("field1")]
/// [XuiavrgFieldTag(XuiavrgFieldTag.Context)]
/// public float fieldValue = 0.1f;
/// </summary>
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public class XuiavrgFieldTagAttribute : Attribute, IXuiavrgAttribute
{
/// <summary>功能标记</summary>
public readonly XuiavrgFieldTag Tag;
/// <summary>同一 Tag 存在多个时的索引区分</summary>
public readonly int TagIndex;
/// <summary>
/// 创建字段功能标记
/// </summary>
/// <param name="tag">功能标记</param>
/// <param name="tagIndex">标记索引(同一 Tag 存在多个时区分)</param>
public XuiavrgFieldTagAttribute(XuiavrgFieldTag tag, int tagIndex = 0)
{
Tag = tag;
TagIndex = tagIndex;
}
public void BindMetaData(AvrgMemberMetaData metaData)
{
metaData.Tag = Tag;
metaData.TagIndex = TagIndex;
}
}
}