首页 > 解决方案 > 如何获取具有列表的属性的值在 C# 中?

问题描述

我有以下课程

public class MyClass
{
    public string Name {get; set;}
    public List<string> Products {get; set;}
}

如果我使用下面的代码,我可以获得'''Name'''属性的值。但是无法获取产品列表的值。

怎么做?

Type type = user.GetType();
PropertyInfo[] props = type.GetProperties();
string str = "{";
foreach (var prop in props)
{
   str+= (prop.Name+":"+  prop.GetValue(user))+",";
}
return str.Remove(str.Length-1)+"}";

标签: c#system.reflection

解决方案


向类型添加ToJson()方法:

public class MyClass
{
    public string Name {get; set;}
    public List<string> Products {get; set;}

    public string ToJson()
    {
        var result = new StringBuilder("{");
        result.Append("\"Name\":\"")
              .Append(Name)
              .Append("\",{\"Products\":[{\"Product\":\"");

        var delimiter = "";
        foreach(var product in Products)
        {
           result.Append(delimter).Append(product);
           delimiter = "\"},{\"Product\":\"";
        }
        result.Append("\"}]}");
        return result.ToString();
    }
}

那么代码就变成了:

string str = user.ToJson();

如果您需要为许多不同的类型执行此操作,请创建一个它们可以实现的接口:

interface ICanHazJson
{
    string ToJson();
}

然后让你关心的每个类型都实现接口:

public class MyClass : ICanHazJson
{
    public string Name {get; set;}
    public List<string> Products {get; set;}

    public string ToJson()
    {
        var result = new StringBuilder("{");
        result.Append("\"Name\":\"")
              .Append(Name)
              .Append("\",{\"Products\":[{\"Product\":\"");

        var delimiter = "";
        foreach(var product in Products)
        {
           result.Append(delimter).Append(product);
           delimiter = "\"},{\"Product\":\"";
        }
        result.Append("\"}]}");
        return result.ToString();
    }
}

如果有很多类型很重要,那就更有理由在 NuGet 上找到一个经过实战考验的 json 序列化程序,它可以满足您的需要,并且不会在一些意外的边缘情况下崩溃。


推荐阅读