【问题标题】:C# how to build dynamic objectC#如何构建动态对象
【发布时间】:2021-08-05 11:09:03
【问题描述】:

我正在处理 Json 文件并向数据库添加值,但是有没有办法动态构建 Payload 以仅包含 Json 中显示的列?

code payloadMessageContext.Update(new Payload {
    Id = 1,
    column1 = Attributes.Where(x => x.Key == "column1")?.FirstOrDefault().Value.ToString(),
    column2 = Attributes.Where(x => x.Key == "column2")?.FirstOrDefault().Value.ToString(),
    column3 = Attributes.Where(x => x.Key == "column3")?.FirstOrDefault().Value.ToString(),
    column4 = Attributes.Where(x => x.Key == "column4")?.FirstOrDefault().Value.ToString(),
});
await payloadMessageContext.SaveChangesAsync();

我使用的 Json 文件是动态的,例如,如果我对系统中的所有 4 列进行了更新,那么它将生成我可以用于我的 Paylod 的格式,但如果我对 column1 进行了更新,则 Json 包含只有 column1 的 Key,然后它不能用于我的 Paylod,因为代码将为 column2、column3 和 column4 抛出空异常

【问题讨论】:

  • Where 永远不会返回 null 所以 Attributes.Where(...)?. 是没用的。另一方面FirstOrDefault 可能返回null,因此你必须写FirstOrDefault()?.
  • 感谢问题更多的是如果 Key== "column2" 在 json 中不存在,如何从 Paylod 跳过例如 column2
  • 请选择一个 C# 版本。
  • Attributes 长什么样子?
  • 什么类型的列表?

标签: c# json c#-4.0 json-deserialization


【解决方案1】:

假设 AattributesDictionary<string, string> 你可以这样做:

static void Main(string[] args)
{
    var Aattributes = new Dictionary<string, string>
    {
        ["Column1"] = "NewColumn1",
        ["Column3"] = "NewColumn3",
    };

    var payload = new Payload();

    Set(Aattributes, "Column1", payload, (target, val) => target.Column1 = val);
    Set(Aattributes, "Column2", payload, (target, val) => target.Column2 = val);
    Set(Aattributes, "Column3", payload, (target, val) => target.Column3 = val);
    Set(Aattributes, "Column4", payload, (target, val) => target.Column4 = val);
}

private static void Set<TTarget>(IDictionary<string, string> source, string key, TTarget target, Action<TTarget, string> setter)
{
    if (source.ContainsKey(key))
    {
        var value = source[key];
        setter(target, value);
    }
}

【讨论】:

  • ["Column3"] = "NewColumn3" 只是您的Attributes 列表/字典中的一个示例。当且仅当key 出现在Attributes 中时,Payload.ColumnX 属性的设置才会在 Set 方法中发生。
猜你喜欢
  • 2019-04-15
  • 1970-01-01
  • 2014-05-31
  • 2015-11-05
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多