Co-authored-by: zzdxxz <2079238449@qq.com> Co-committed-by: zzdxxz <2079238449@qq.com>
129 lines
4.4 KiB
C#
129 lines
4.4 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Text;
|
|
using System.Xml.Linq;
|
|
|
|
namespace Data
|
|
{
|
|
public abstract class Define
|
|
{
|
|
public string defName;
|
|
public string description;
|
|
public string label;
|
|
public string packID;
|
|
|
|
/// <summary>
|
|
/// 初始化方法,根据传入的 XML 元素 (<paramref name="xmlDef" />) 进行处理。
|
|
/// </summary>
|
|
/// <param name="xmlDef">包含定义信息的 XML 元素。</param>
|
|
/// <returns>
|
|
/// 返回一个布尔值:
|
|
/// - 如果返回 <c>false</c>,表示按照默认方式处理(依次对 XML 进行变量名识别和赋值)。
|
|
/// - 如果返回 <c>true</c>,表示使用自定义方式处理,不进行额外的默认处理。
|
|
/// </returns>
|
|
/// <remarks>
|
|
/// <para>
|
|
/// 该方法的基类实现会自动识别并处理以下三个变量:
|
|
/// - <c>defName</c>
|
|
/// - <c>label</c>
|
|
/// - <c>description</c>
|
|
/// </para>
|
|
/// <para>
|
|
/// 如果需要覆盖默认行为,可以在派生类中重写此方法,并返回 <c>true</c>
|
|
/// 以指示框架跳过默认处理逻辑。
|
|
/// </para>
|
|
/// </remarks>
|
|
public virtual bool Init(XElement xmlDef)
|
|
{
|
|
defName = xmlDef.Element("defName")?.Value;
|
|
label = xmlDef.Element("label")?.Value;
|
|
description = xmlDef.Element("description")?.Value;
|
|
return false;
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
var sb = new StringBuilder();
|
|
|
|
// 使用反射获取当前类的所有字段和属性
|
|
var fieldsAndProperties = GetAllFieldsAndProperties(this);
|
|
|
|
foreach (var member in fieldsAndProperties)
|
|
{
|
|
var name = member.Name;
|
|
var value = GetValue(member, this);
|
|
|
|
if (value is IList list && list.Count > 0) // 如果是列表类型
|
|
{
|
|
sb.AppendLine($"{name}:");
|
|
foreach (var item in list) sb.AppendLine($" - {FormatValue(item)}");
|
|
}
|
|
else if (value is Define defineObject) // 如果是继承自 Define 的子类
|
|
{
|
|
if (!string.IsNullOrEmpty(defineObject.defName))
|
|
{
|
|
sb.AppendLine($"{name}: {defineObject.defName}");
|
|
}
|
|
else
|
|
{
|
|
sb.AppendLine($"{name}:");
|
|
sb.AppendLine(Indent(defineObject.ToString(), " "));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sb.AppendLine($"{name}: {FormatValue(value)}");
|
|
}
|
|
}
|
|
|
|
return sb.ToString();
|
|
}
|
|
|
|
private static IEnumerable<MemberInfo> GetAllFieldsAndProperties(object obj)
|
|
{
|
|
var type = obj.GetType();
|
|
return type.GetFields(BindingFlags.Public | BindingFlags.Instance)
|
|
.Concat(type.GetProperties(BindingFlags.Public | BindingFlags.Instance).Cast<MemberInfo>());
|
|
}
|
|
|
|
private static object GetValue(MemberInfo member, object obj)
|
|
{
|
|
switch (member)
|
|
{
|
|
case FieldInfo field:
|
|
return field.GetValue(obj);
|
|
case PropertyInfo property:
|
|
return property.GetValue(obj);
|
|
default:
|
|
throw new ArgumentException("Unsupported member type.");
|
|
}
|
|
}
|
|
|
|
private static string FormatValue(object value)
|
|
{
|
|
return value?.ToString() ?? "null";
|
|
}
|
|
|
|
private static string Indent(string text, string prefix)
|
|
{
|
|
return string.Join(Environment.NewLine, text.Split('\n').Select(line => prefix + line));
|
|
}
|
|
}
|
|
|
|
public class DefineReference : Define
|
|
{
|
|
public Define def;
|
|
public string className;
|
|
public string fieldName;
|
|
|
|
public DefineReference(string className, string defName, string fieldName)
|
|
{
|
|
this.defName = defName;
|
|
this.className = className;
|
|
this.fieldName = fieldName;
|
|
}
|
|
}
|
|
} |