diff --git a/Client/Assets/Scripts/Data/DefinePack.cs b/Client/Assets/Scripts/Data/DefinePack.cs
index a626b75..b5c0b22 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;
@@ -217,8 +217,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)
@@ -278,5 +281,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