(client) chore:修改了角色的身体结构的定义方式,现在图片资源统一使用ImageDef加载,使用了更节省资源的初始化方式;fix:修复了定义加载数组时只能初始化数组而不能初始化列表的问题
This commit is contained in:
@ -303,27 +303,40 @@ namespace Data
|
||||
|
||||
private static object ProcessArrayField(FieldInfo field, XElement element)
|
||||
{
|
||||
var elementType = field.FieldType.GetElementType();
|
||||
// 获取集合元素的类型
|
||||
Type elementType = field.FieldType.IsArray
|
||||
? field.FieldType.GetElementType()
|
||||
: field.FieldType.GetGenericArguments()[0];
|
||||
|
||||
if (elementType == null) return null;
|
||||
|
||||
var arrayElements = new List<object>();
|
||||
|
||||
// 遍历 XML 元素中的子元素
|
||||
foreach (var liElement in element.Elements())
|
||||
{
|
||||
if (elementType.IsSubclassOf(typeof(Define)))
|
||||
{
|
||||
// 如果是 Define 类型或其子类
|
||||
var nestedDefine = (Define)Activator.CreateInstance(elementType);
|
||||
DefaultInitDefine(nestedDefine, liElement, elementType);
|
||||
arrayElements.Add(nestedDefine);
|
||||
}
|
||||
else if (elementType.IsArray) // 嵌套数组处理
|
||||
else if (elementType.IsArray || typeof(IList).IsAssignableFrom(elementType))
|
||||
{
|
||||
// 递归处理嵌套数组
|
||||
// 嵌套数组处理(递归调用)
|
||||
var pseudoField = new { FieldType = elementType };
|
||||
var nestedArray = ProcessArrayField(
|
||||
new { FieldType = elementType }.GetType().GetField("FieldType"),
|
||||
pseudoField.GetType().GetField("FieldType"),
|
||||
liElement
|
||||
);
|
||||
arrayElements.Add(nestedArray);
|
||||
}
|
||||
else if (elementType.IsEnum)
|
||||
{
|
||||
// 枚举类型处理
|
||||
arrayElements.Add(Enum.Parse(elementType, liElement.Value));
|
||||
}
|
||||
else
|
||||
{
|
||||
// 基本类型处理
|
||||
@ -331,14 +344,35 @@ namespace Data
|
||||
}
|
||||
}
|
||||
|
||||
// 构建结果数组
|
||||
var resultArray = Array.CreateInstance(elementType, arrayElements.Count);
|
||||
for (var i = 0; i < arrayElements.Count; i++)
|
||||
// 根据目标字段的类型构建结果
|
||||
if (field.FieldType.IsArray)
|
||||
{
|
||||
resultArray.SetValue(arrayElements[i], i);
|
||||
// 如果目标字段是数组类型
|
||||
var resultArray = Array.CreateInstance(elementType, arrayElements.Count);
|
||||
for (var i = 0; i < arrayElements.Count; i++)
|
||||
{
|
||||
resultArray.SetValue(arrayElements[i], i);
|
||||
}
|
||||
|
||||
return resultArray;
|
||||
}
|
||||
return resultArray;
|
||||
else if (typeof(IList).IsAssignableFrom(field.FieldType))
|
||||
{
|
||||
// 如果目标字段是泛型集合类型(如 List<T>)
|
||||
var listType = typeof(List<>).MakeGenericType(elementType);
|
||||
var resultList = (IList)Activator.CreateInstance(listType);
|
||||
foreach (var item in arrayElements)
|
||||
{
|
||||
resultList.Add(item);
|
||||
}
|
||||
|
||||
return resultList;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 从 List<c>XDocument</c> 中查找指定根元素名称的文档。
|
||||
/// </summary>
|
||||
|
Reference in New Issue
Block a user