我有一个如下列表(样本):
但是这个列表只是逻辑的一个例子。该列表应该是动态的。列表字段可能有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;
}
答案 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>");
}
}