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 class Define { public string defName; public string description; public string label; public string packID; public bool isReferene = false; /// /// 初始化方法,根据传入的 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(); // 显示基类中的基本信息 sb.AppendLine($"Define {{"); sb.AppendLine($"\tdefName: {defName}"); sb.AppendLine($"\tdescription: {description}"); sb.AppendLine($"\tlabel: {label}"); // 获取当前对象的所有字段 var fields = GetType().GetFields(BindingFlags.Public | BindingFlags.Instance); foreach (var field in fields) { if (field.Name == "defName" || field.Name == "description" || field.Name == "label") continue; // 已经显示过的基本信息跳过 sb.Append("\t"); sb.Append(field.Name); sb.Append(": "); AppendFieldInfo(sb, field.GetValue(this), "\t\t"); sb.AppendLine(); } sb.Append("}"); return sb.ToString(); } private void AppendFieldInfo(StringBuilder sb, object value, string indent) { if (value == null) { sb.Append("null"); return; } var type = value.GetType(); // 如果是简单类型(如 int, string, bool 等) if (type.IsPrimitive || type == typeof(string) || type == typeof(decimal)) { sb.Append(value); } // 如果是集合类型(如 List, Dictionary 等) else if (typeof(IEnumerable).IsAssignableFrom(type) && !(value is string)) { sb.AppendLine(" ["); var isFirst = true; foreach (var item in (IEnumerable)value) { if (!isFirst) sb.AppendLine(","); isFirst = false; sb.Append(indent); AppendFieldInfo(sb, item, indent + "\t"); } if (!isFirst) // 如果集合不为空,则添加逗号后的换行 sb.AppendLine(); sb.Append(indent.TrimEnd('\t')); // 回退一级缩进 sb.Append("]"); } // 如果是自定义对象类型 else { sb.AppendLine(" {"); var fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance); var isFirst = true; foreach (var field in fields) { if (!isFirst) sb.AppendLine(","); isFirst = false; sb.Append(indent); sb.Append(field.Name); sb.Append(": "); AppendFieldInfo(sb, field.GetValue(value), indent + "\t"); } if (!isFirst) // 如果对象有字段,则添加逗号后的换行 sb.AppendLine(); sb.Append(indent.TrimEnd('\t')); // 回退一级缩进 sb.Append("}"); } } } }