XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEExtension

【DLL】XFE各类拓展是一个C#的DLL库,旨在优化C#代码中常用语句的使用,并提供更简洁的访问方式,同时提供Xunit测试框架,快速搭建服务器/客户端,免费ChatGPTAPI接口,免费通讯服务器,XFE下载器,新增格式等

公开
关注 0 Fork 0 Star 0
UTF-8
using XFEExtension.NetCore.XFETransform.ObjectInfoAnalyzer;

namespace XFEExtension.NetCore.XFETransform.StringConverter;

/// <summary>
/// 对象分析类
/// </summary>
public class ObjectAnalyzer : StringConverter
{
    /// <summary>
    /// 分析对象
    /// </summary>
    /// <param name="objectInfo"></param>
    /// <returns></returns>
    public override string OutPutObject(IObjectInfo objectInfo)
    {
        var outPutString = string.Empty;
        if (objectInfo.IsBasicType || objectInfo.ObjectPlace == ObjectPlace.Enum)
        {
            if (objectInfo.Value is null)
            {
                outPutString += $"{AddObjectPlace(objectInfo)} {XFEConverter.OutPutTypeName(objectInfo.Type!)} {objectInfo.Name}:null\n";
            }
            else if (objectInfo.ObjectPlace == ObjectPlace.Enum)
            {
                outPutString += $"{AddObjectPlace(objectInfo)} {XFEConverter.OutPutTypeName(objectInfo.Type!)} {objectInfo.Name}:{objectInfo.Value}[{(int)objectInfo.Value}]\n";
            }
            else if (objectInfo.Value is "")
            {
                outPutString += $"{AddObjectPlace(objectInfo)} {XFEConverter.OutPutTypeName(objectInfo.Type!)} {objectInfo.Name}:string.Empty\n";
            }
            else
            {
                outPutString += $"{AddObjectPlace(objectInfo)} {XFEConverter.OutPutTypeName(objectInfo.Type!)} {objectInfo.Name}:{objectInfo.Value}\n";
            }
        }
        else
        {
            if (objectInfo.Layer == 0)
            {
                if (objectInfo.SubObjects == null)
                {
                    if (objectInfo.Value is null)
                        outPutString += $"{AddObjectPlace(objectInfo)} {XFEConverter.OutPutTypeName(objectInfo.Type!)} {objectInfo.Name}: null";
                    else
                        outPutString += $"{AddObjectPlace(objectInfo)} {XFEConverter.OutPutTypeName(objectInfo.Type!)} {objectInfo.Name}: {objectInfo.Value}";
                }
                else if (objectInfo.SubObjects?.Count > 0)
                {
                    outPutString += $"""
                        {AddObjectPlace(objectInfo)} {XFEConverter.OutPutTypeName(objectInfo.Type!)} {objectInfo.Name}
                        ┌────┬────────────────────────────
                        {OutPutSubObjects(objectInfo.SubObjects)}
                        └─────────────────────────────────
                        """;
                }
                else
                {
                    outPutString += $"""
                        {AddObjectPlace(objectInfo)} {XFEConverter.OutPutTypeName(objectInfo.Type!)} {objectInfo.Name}
                        ┌────┬────────────────────────────
                        │    └─无内容"
                        └─────────────────────────────────
                        """;
                }
            }
            else
            {
                var tabString = string.Empty;
                for (var k = 0; k < objectInfo.Layer; k++)
                {
                    tabString += "│    ";
                }

                if (objectInfo.SubObjects is null)
                    return outPutString;

                if (objectInfo.SubObjects.Count > 0)
                    outPutString += OutPutSubObjects(objectInfo.SubObjects);
                else
                    outPutString += $"{tabString}│    └─无内容";
            }
        }
        return outPutString;
    }

    /// <summary>
    /// 分析子对象信息
    /// </summary>
    /// <param name="subObjects"></param>
    /// <returns></returns>
    public override string OutPutSubObjects(ISubObjects subObjects)
    {
        var outString = string.Empty;
        for (var i = 0; i < subObjects.Count; i++)
        {
            var obj = subObjects[i];
            var tabString = string.Empty;
            for (var k = 0; k < obj.Layer; k++)
            {
                tabString += "│    ";
            }
            outString += tabString;
            var currentConnectString = i == subObjects.Count - 1 ? "└─" : "├─";
            if (obj.IsBasicType || obj.ObjectPlace == ObjectPlace.Enum)
            {
                outString += currentConnectString;
                outString += obj.OutPutObject();
            }
            else
            {
                if (obj.SubObjects is null)
                {
                    outString += $"{currentConnectString}{AddObjectPlace(obj)} {XFEConverter.OutPutTypeName(obj.Type!)} {obj.Name}: null\n";
                }
                else
                {
                    outString += $"""
                     ├─{AddObjectPlace(obj)} {XFEConverter.OutPutTypeName(obj.Type!)} {obj.Name}
                     {tabString}├────┬────────────────────────────
                     {obj.OutPutObject()}
                     {tabString}{currentConnectString}────────────────────────────────

                     """;
                }
            }
        }
        if (outString.Length > 0 && outString[^1] == '\n')
        {
            outString = outString[..^1];
        }
        return outString;
    }

    internal static string AddObjectPlace(IObjectInfo objectInfo) => objectInfo.ObjectPlace switch
    {
        ObjectPlace.Property => "[属性]",
        ObjectPlace.Field => "[字段]",
        ObjectPlace.Main => "[主体]",
        ObjectPlace.Array => "[数组]",
        ObjectPlace.ArrayMember => "[数组成员]",
        ObjectPlace.List => "[列表]",
        ObjectPlace.ListMember => "[列表成员]",
        ObjectPlace.Enum => "[枚举]",
        ObjectPlace.Other => "[其他]",
        _ => string.Empty,
    };
}