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; /// /// 初始化方法,根据传入的 XML 元素 () 进行处理。 /// /// 包含定义信息的 XML 元素。 /// /// 返回一个布尔值: /// - 如果返回 false,表示按照默认方式处理(依次对 XML 进行变量名识别和赋值)。 /// - 如果返回 true,表示使用自定义方式处理,不进行额外的默认处理。 /// /// /// /// 该方法的基类实现会自动识别并处理以下三个变量: /// - defName /// - label /// - description /// /// /// 如果需要覆盖默认行为,可以在派生类中重写此方法,并返回 true /// 以指示框架跳过默认处理逻辑。 /// /// 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 GetAllFieldsAndProperties(object obj) { var type = obj.GetType(); return type.GetFields(BindingFlags.Public | BindingFlags.Instance) .Concat(type.GetProperties(BindingFlags.Public | BindingFlags.Instance).Cast()); } 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; } } }