142 lines
4.8 KiB
C#
142 lines
4.8 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 class Define
|
|
{
|
|
public string defName;
|
|
public string description;
|
|
public string label;
|
|
public string packID;
|
|
|
|
public bool isReferene = false;
|
|
|
|
/// <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();
|
|
|
|
// 显示基类中的基本信息
|
|
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<T>, Dictionary<K,V> 等)
|
|
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("}");
|
|
}
|
|
}
|
|
}
|
|
|
|
} |