从C#中的列表转换为html(嵌套ul li)

时间:2015-07-17 17:53:43

标签: javascript c# html reflection converter

我有一个如下列表(样本):

Convert to html (nested ul li) from list in C#

但是这个列表只是逻辑的一个例子。该列表应该是动态的。列表字段可能有3个以上,列表可以包含子集合(数据格式如json)

我想转换嵌套的ul-li html标签。我想,我可以通过以下反思做到这一点。但我第一次使用反思。我的代码就像现在一样。我该怎么做?

    public static string ConvertToHtml<T>(IEnumerable<T> list) where T : class
    {
        StringBuilder html = new StringBuilder();
        foreach (var item in list)
        {
            Type itemType = item.GetType();
            if (itemType.IsClass)
            {
                FieldInfo[] fieldInfo = itemType.GetFields(BindingFlags.Public | BindingFlags.Instance); // Field?
                if (fieldInfo.Any())
                {
                    foreach (var field in fieldInfo)
                    {
                        var name = field.Name;
                        var value = field.GetValue(item);
                    }
                }
                PropertyInfo[] propertyInfo = itemType.GetProperties(BindingFlags.Public | BindingFlags.Instance); // Property?
                if (propertyInfo.Any())
                {
                    foreach (var property in propertyInfo)
                    {
                        var name = property.Name;
                        var value = property.GetValue(item);
                    }
                }

            }
        }
        return string.Empty;
    }

1 个答案:

答案 0 :(得分:2)

很可能你选择了一种错误的方法来完成任务。反射通常用于查询运行时代码结构,如类型,字段,属性和方法。最常见的用例是创建一个用于任意类型的序列化/反序列化的方法。

在你的情况下,它看起来不像任意结构 - 你有相当严格的数据结构,即使它支持无限(概念)嵌套级别(如JSON)。换句话说,你有“树”https://en.wikipedia.org/wiki/Tree_(data_structure)

要遍历它,存在几种算法:https://en.wikipedia.org/wiki/Tree_traversal当然对于大多数算法,您可以轻松找到示例实现:Implementing Depth First Search into C# using List and Stack但问题有点棘手,因为您首先需要理解这个概念。

树遍历算法通常是递归的。因此,为了做到正确,你也必须深入了解这个概念。

之后,构建列表的代码非常简单:

public class Node {
    string Name { get; set; }
    IList<Node> Subnodes { get; private set; }
}

private void BuildList(Node node, StringBuilder sb) {
    sb.Append("<ul>");
    foreach (var n in node.Subnodes) {
        sb.Append("<li>" + n.Name);
        BuildList(n, sb);
        sb.Append("</li>");
    }
    sb.Append("</ul>");
}

public string BiuldList(Node root) {
    var sb = new StringBuilder();
    BuildList(root, sb);
    return sb.ToString();
}

修改

使用给定的代码,它会在没有孩子的<ul></ul>项内生成空<li></li>个标签。所以我稍微改了一下条件,只有在有孩子时才创建子列表。

代码:

private void BuildList(Node node, StringBuilder sb) {
       if(node.Subnodes.Count > 0){
            sb.Append("<ul>");
            foreach (var n in node.Subnodes) {
                sb.Append("<li>" + n.Name);
                BuildList(n, sb);
                sb.Append("</li>");
            }
            sb.Append("</ul>");
        }
    }