真正动态的 C# 对象 - 使用 <n> 个属性(和动态 属性 个名称)旋转数据

Truly dynamic C# objects - pivoting data with <n> number of properties (and dynamic property names)

对于我所缺少的这个问题,必须有一个优雅的解决方案。我正在寻找的东西似乎非常简单,但我还没有想出一个方法来完成它。

我有以下对象:

internal class OverrideValue
{
    public int RID { get; set; }
    public int PID { get; set; }
    public string Value { get; set; }
}

一个给定的 RID 可以有多个 PID/value 组合。我需要 return 使用 JSON 将一个动态创建(并命名)的列表返回给客户端。因此,鉴于以下内容:

var overrideList = new List<OverrideValue>()
{
    new OverrideValue() {RID = 1, PID = 1, Value = "200"},
    new OverrideValue() {RID = 1, PID = 2, Value = "250"},
    new OverrideValue() {RID = 2, PID = 1, Value = "200"},
    new OverrideValue() {RID = 2, PID = 3, Value = "300"},
    new OverrideValue() {RID = 2, PID = 4, Value = "255"}
};

我需要 return 这样的对象:

{ "overrides":[
    { "RID":1, "PID_1":"200", "PID_2":"250" },
    { "RID":2, "PID_1":"200", "PID_3":"300", "PID_4":"255" }
]}

如果我的数据库 return 的 PID 为 400,000,我需要该对象包含一个名为“PID_4000000”的 属性关联值。

我意识到类型安全是 C# 的重要组成部分,但对于我来说不得不为这种情况手动构造 JSON 似乎很荒谬。似乎应该有一个内置方法让我能够创建一个动态对象。我曾尝试使用 ExpandoObject(),但我得到的只是 Dictionary() key/value 对的列表,这是毫无价值的 - 序列化时,属性为 "key" 和 "value".

归根结底,我使用的网格只会绑定到平面(一维)JSON 数据源,我需要使用恰好来自我的任何数据来构建网格方式。

看看您是如何保存数据的,这种 json 表示不是默认表示,因为您将多个列表条目合并为 1 个组合条目。

我建议使用 Jsom 序列化程序,它允许您定义应该解析的 attributes/functions。然后实现一个函数,returns一个字典列表,将列表条目组合成相应的组合项。然后让序列化器序列化该函数的输出,你就完成了。

您可以使用此 class 来执行此操作:Json.NET JSONConvertor

这有点老套,但应该足以让您继续学习并根据您的需要进行调整。它使用 Linq 对值进行分组,并使用字典来存储分组的项目。

首先我们需要一个包装器 class 来正确匹配您的输出:

public class Output
{
    public IEnumerable<Dictionary<string, int>> Overrides { get; set; }
}

现在我们可以对您的数据进行分组:

//Grou pand aggregate the data
var results = overrideList
    .GroupBy(l => l.RID)
    .Select(l =>
    {
        var dictionary = new Dictionary<string, int>();
        dictionary.Add("RID", l.Key);
        foreach (var pidValue in l)
        {
            dictionary.Add($"PID_{pidValue.PID}", int.Parse(pidValue.Value));
        }
        return dictionary;
    });

//Throw the data into our output class
var output = new Output
{
    Overrides = results
};

//Convert to JSON
var json = JsonConvert.SerializeObject(output);

这会产生类似这样的输出:

{"Overrides":[
    {"RID":1,"PID_1":200,"PID_2":250},
    {"RID":2,"PID_1":200,"PID_3":300,"PID_4":255}
]}