using System.Reflection; using XFEExtension.NetCore.XFETransform.StringConverter; namespace XFEExtension.NetCore.XFETransform.ObjectInfoAnalyzer; internal abstract class ObjectInfo : IObjectInfo { /// /// 获取对象在其父级中的名称。 /// public string? Name { get; init; } /// /// 获取对象相对于父级的成员位置类型。 /// public ObjectPlace ObjectPlace { get; init; } /// /// 获取对象在分析结果树中的层级深度。 /// public int Layer { get; init; } /// /// 获取当前对象所保存的原始值。 /// public object? Value { get; init; } /// /// 获取当前对象的运行时类型。 /// public Type? Type { get; init; } /// /// 获取当前对象是否可作为基础类型直接转换。 /// public bool IsBasicType { get; init; } /// /// 获取当前对象是否表示数组。 /// public bool IsArray { get; init; } /// /// 获取当前对象包含的子对象集合。 /// public ISubObjects? SubObjects { get; init; } /// /// 获取负责输出当前对象信息的字符串转换器。 /// public IStringConverter? StringConverter { get; init; } /// /// 获取当前对象来源字段的反射信息。 /// public FieldInfo? FieldInfo { get; init; } /// /// 获取当前对象来源属性的反射信息。 /// public PropertyInfo? PropertyInfo { get; init; } /// /// 获取或设置当前对象在分析结果树中的父对象。 /// public IObjectInfo? Parent { get; set; } /// /// 使用当前对象配置的字符串转换器输出对象信息。 /// /// 字符串转换器生成的对象描述。 public string OutPutObject() { return StringConverter!.OutPutObject(this); } /// /// 创建不包含子对象集合的对象信息,适用于基础值或叶子节点。 /// /// 对象来源字段的反射信息。 /// 对象来源属性的反射信息。 /// 用于输出对象信息的字符串转换器。 /// 对象在其父级中的名称。 /// 对象相对于父级的成员位置类型。 /// 对象在分析结果树中的层级深度。 /// 对象的运行时类型。 /// 对象是否可作为基础类型直接转换。 /// 对象的原始值。 public ObjectInfo(FieldInfo? fieldInfo, PropertyInfo? propertyInfo, IStringConverter? stringConverter, string? name, ObjectPlace objectPlace, int layer, Type? type, bool isBasicType, object? value = null) { FieldInfo = fieldInfo; PropertyInfo = propertyInfo; StringConverter = stringConverter; Name = name; ObjectPlace = objectPlace; Layer = layer; Type = type; IsBasicType = isBasicType; IsArray = false; Value = value; } /// /// 创建包含子对象集合的对象信息,并将所给子对象关联到当前对象。 /// /// 对象来源字段的反射信息。 /// 对象来源属性的反射信息。 /// 用于输出对象信息的字符串转换器。 /// 对象在其父级中的名称。 /// 对象相对于父级的成员位置类型。 /// 对象在分析结果树中的层级深度。 /// 对象的运行时类型。 /// 对象是否可作为基础类型直接转换。 /// 对象是否表示数组。 /// 对象的原始值。 /// 作为当前对象子节点的对象信息列表。 public ObjectInfo(FieldInfo? fieldInfo, PropertyInfo? propertyInfo, IStringConverter? stringConverter, string? name, ObjectPlace objectPlace, int layer, Type? type, bool isBasicType, bool isArray, object? value = null, List? objectInfoList = null) { FieldInfo = fieldInfo; PropertyInfo = propertyInfo; StringConverter = stringConverter; Name = name; ObjectPlace = objectPlace; Layer = layer; Type = type; IsBasicType = isBasicType; IsArray = isArray; Value = value; SubObjects = new SubObjectsImpl(this, objectInfoList); } }