From e5ed968d12958644bfbf3a9891e7522f4edcf8fc Mon Sep 17 00:00:00 2001 From: m0_75251201 Date: Mon, 14 Jul 2025 11:39:31 +0800 Subject: [PATCH] =?UTF-8?q?(client)=20chore:=E8=BF=90=E8=A1=8C=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E5=86=85=E8=81=94=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Client/Assets/Scripts/Data/DefinePack.cs | 43 +++++++++++++++++++----- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/Client/Assets/Scripts/Data/DefinePack.cs b/Client/Assets/Scripts/Data/DefinePack.cs index a626b75..25e39cb 100644 --- a/Client/Assets/Scripts/Data/DefinePack.cs +++ b/Client/Assets/Scripts/Data/DefinePack.cs @@ -6,6 +6,7 @@ using System.Text; using System.Xml.Linq; using Configs; using UnityEngine; +using Object = System.Object; namespace Data { @@ -141,7 +142,7 @@ namespace Data if (string.IsNullOrEmpty(className)) continue; // Debug.Log("1"); - var def = LoadDefineClass(element); + var def = LoadDefineClass(element,element.Name.ToString()); if (def == null) continue; // Debug.Log("2"); @@ -152,9 +153,8 @@ namespace Data } } - private Define LoadDefineClass(XElement defineDoc) + private Define LoadDefineClass(XElement defineDoc,string className) { - var className = defineDoc.Name.ToString(); var assembly = Assembly.GetExecutingAssembly(); Type type; @@ -206,8 +206,14 @@ namespace Data } if (define.Init(defineDoc)) return define; - // 获取类的所有字段(不包括私有字段) - var fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic); + DefaultInitDefine(define,defineDoc, type); + + return define; + } + + public void DefaultInitDefine(Define define,XElement defineDoc,Type defineType) + { + var fields = defineType.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic); // 遍历字段并尝试从 XElement 中赋值 foreach (var field in fields) @@ -217,8 +223,11 @@ namespace Data if (element != null) try { - // 将子元素的值转换为目标类型并赋值 - var value = Convert.ChangeType(element.Value, field.FieldType); + Object value; + if (IsFieldTypeInheritedFrom(field, typeof(Define))) + value = LoadDefineClass(element, field.FieldType.Name); + else + value = Convert.ChangeType(element.Value, field.FieldType); field.SetValue(define, value); } catch (Exception ex) @@ -226,8 +235,6 @@ namespace Data Debug.LogWarning($"Error setting field {field.Name}: {ex.Message}"); } } - - return define; } /// @@ -278,5 +285,23 @@ namespace Data return sb.ToString(); } + + /// + /// 检查字段的类型是否继承自指定的类 + /// + /// 字段信息 + /// 要检查的基类类型 + /// 如果字段的类型是基类或其派生类,则返回 true + public static bool IsFieldTypeInheritedFrom(FieldInfo field, Type baseType) + { + // 获取字段的类型 + var fieldType = field.FieldType; + // 如果字段的类型为 null 或不是基类的派生类,则返回 false + if (!baseType.IsAssignableFrom(fieldType)) + return false; + + // 如果字段的类型直接是基类或其派生类,则返回 true + return fieldType != baseType && baseType.IsAssignableFrom(fieldType); + } } } \ No newline at end of file