真正动态的 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}
]}
对于我所缺少的这个问题,必须有一个优雅的解决方案。我正在寻找的东西似乎非常简单,但我还没有想出一个方法来完成它。
我有以下对象:
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}
]}