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);
}
}