C# 如何显示来自MongoDB的映射类,包括树视图中的额外元素?

C# 如何显示来自MongoDB的映射类,包括树视图中的额外元素?,c#,winforms,mongodb,treeview,C#,Winforms,Mongodb,Treeview,我有一个类映射到MongoDB文档,该文档表示车辆刷新的条目。以下是该类的外观,以供参考: public class VehicleEntry { [BsonElement("@Date")] [BsonDefaultValue("")] public String Date { get; set; } [BsonElement("@Vin")] [BsonDefaultValue("")] public String Vin { get; se

我有一个类映射到MongoDB文档,该文档表示车辆刷新的条目。以下是该类的外观,以供参考:

public class VehicleEntry
{
    [BsonElement("@Date")]
    [BsonDefaultValue("")]
    public String Date { get; set; }

    [BsonElement("@Vin")]
    [BsonDefaultValue("")]
    public String Vin { get; set; }

    [BsonElement("PostFlashDTCs")]
    [BsonDefaultValue("0")]
    public String PostFlashDTCs { get; set; }

    [BsonElement("PreFlashDTCs")]
    [BsonDefaultValue("0")]
    public String PreFlashDTCs { get; set; }

    [BsonElement("UserName")]
    [BsonDefaultValue("")]
    public String UserName { get; set; }

    [BsonExtraElements]
    public BsonDocument ExtraElements { get; set; }
}

我想把它显示在树视图中,但是我很难,因为我必须考虑多个元素类型以及不确定的嵌套量(这就是为什么我相信这里的树视图是好的)。我确信这将需要递归,但我不确定如何使用它和循环属性



我自我回答这个问题是为了帮助任何偶然发现它的未来用户,但我当然愿意接受建议或替代方法。

反射命名空间可用于迭代VehicleEntry对象中的各个属性。假设每个VehicleEntry都是它自己的节点,以该节点为标题,我们可以这样循环:

private void DisplayVehiclesForTreeView(List<VehicleEntry> vehicles)
{
    // Loop through each vehicle
    foreach (VehicleEntry vehicle in vehicles)
    {
        // Make node by VehicleEntry
        TreeNode vehNode = new TreeNode("VehicleEntry");

        foreach (PropertyInfo propertyInfo in vehicle.GetType().GetProperties())
        {
            if (propertyInfo.CanRead)
            {
                object val = propertyInfo.GetValue(vehicle, null);
                if (val is string)
                {
                    vehNode.Nodes.Add(new TreeNode(propertyInfo.Name + ": " + val));
                }
                else if (val is BsonDocument)
                {
                    vehNode.Nodes.Add(GetNodeForDocument((BsonDocument)val, propertyInfo.Name));
                }
            }
        }

        // Add node to tree view
        treeView1.Nodes.Add(vehNode);
    }
}
我们知道的另一种情况是,文档将具有字符串、嵌套文档或数组,并且我们会适当地处理每种情况。字符串的显示方式与其他字符串相同,文档和数组文档以递归方式迭代,最后都分解为一个字符串。下面是一个屏幕截图


反射命名空间可用于迭代VehicleEntry对象中的各个属性。假设每个VehicleEntry都是它自己的节点,以该节点为标题,我们可以这样循环:

private void DisplayVehiclesForTreeView(List<VehicleEntry> vehicles)
{
    // Loop through each vehicle
    foreach (VehicleEntry vehicle in vehicles)
    {
        // Make node by VehicleEntry
        TreeNode vehNode = new TreeNode("VehicleEntry");

        foreach (PropertyInfo propertyInfo in vehicle.GetType().GetProperties())
        {
            if (propertyInfo.CanRead)
            {
                object val = propertyInfo.GetValue(vehicle, null);
                if (val is string)
                {
                    vehNode.Nodes.Add(new TreeNode(propertyInfo.Name + ": " + val));
                }
                else if (val is BsonDocument)
                {
                    vehNode.Nodes.Add(GetNodeForDocument((BsonDocument)val, propertyInfo.Name));
                }
            }
        }

        // Add node to tree view
        treeView1.Nodes.Add(vehNode);
    }
}
我们知道的另一种情况是,文档将具有字符串、嵌套文档或数组,并且我们会适当地处理每种情况。字符串的显示方式与其他字符串相同,文档和数组文档以递归方式迭代,最后都分解为一个字符串。下面是一个屏幕截图