在 c# 中动态映射字段。需要反射的替代方案

问题描述 投票:0回答:1

我的班级有以下字段

 [JsonProperty("LTR-AMT-1")]
 public string? LTRAMT1 { get; set; }
 [JsonProperty("LTR-AMT-2")]
 public string? LTRAMT2 { get; set; }
 [JsonProperty("LTR-AMT-3")]
 public string? LTRAMT3 { get; set; }
 [JsonProperty("LTR-AMT-4")]
 public string? LTRAMT4 { get; set; }
 [JsonProperty("LTR-AMT-5")]
 public string? LTRAMT5 { get; set; }
 [JsonProperty("LTR-AMT-6")]
 public string? LTRAMT6 { get; set; }
 [JsonProperty("LTR-AMT-7")]
 public string? LTRAMT7 { get; set; }
 [JsonProperty("LTR-AMT-8")]
 public string? LTRAMT8 { get; set; }
 [JsonProperty("LTR-AMT-9")]
 public string? LTRAMT9 { get; set; }
 [JsonProperty("LTR-AMT-10")]
 public string? LTRAMT10 { get; set; }
 [JsonProperty("LTR-AMT-11")]
 public string? LTRAMT11 { get; set; }
 [JsonProperty("LTR-AMT-12")]
 public string? LTRAMT12 { get; set; }
 [JsonProperty("LTR-AMT-13")]
 public string? LTRAMT13 { get; set; }
 [JsonProperty("LTR-AMT-14")]
 public string? LTRAMT14 { get; set; }
 [JsonProperty("LTR-AMT-15")]
 public string? LTRAMT15 { get; set; }
 [JsonProperty("LTR-AMT-16")]
 public string? LTRAMT16 { get; set; }
 [JsonProperty("LTR-AMT-17")]
 public string? LTRAMT17 { get; set; }
 [JsonProperty("LTR-AMT-18")]
 public string? LTRAMT18 { get; set; }
 [JsonProperty("LTR-AMT-19")]
 public string? LTRAMT19 { get; set; }
 [JsonProperty("LTR-AMT-20")]
 public string? LTRAMT20 { get; set; }
//using dictionary
//public Dictionary<string, string> LTRAMT { get; set; }

我没有在请求正文中按顺序获取这些字段。根据位置,我必须将其映射到相应的 LTRAMT 字段 我有以下方法可以做到这一点

 public static string LtrAmounts(List<Amounts> amounts, int i)
 {
     var filter = amounts.FirstOrDefault(x => x.position == i);
     return filter != null ? filter.value.ToString() : "";
 }

请求正文:

"amounts": [
                    {
                        "value": 0,
                        "position": 1
                    },
                    {
                        "value": 1624.96,
                        "position": 2
                    },
                    {
                        "value": 9901010,
                        "position": 4
                    },
                    {
                        "value": 35776,
                        "position": 20
                    }
                ]

我尝试使用反射,它工作正常,但响应时间更长。

 for (int i = 1; i <= 20; i++)
 {
     ltr.GetType().GetProperty($"LTRAMT{i}").SetValue(ltr, amounts != null ? LtrAmounts(amounts, i) : "");
 }

还尝试过字典

  private static Dictionary<string, string> AssignKeyAndValues(List<Amounts> amounts)
  {
      Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();

     for (int i = 1; i <= 20; i++)
     {
          string key = "LTRAMT" + i;
          string value = LtrAmounts(amounts, i);
          keyValuePairs[key] = value;
      }

      return keyValuePairs;
  }

但是在响应中我得到了父对象,其中我的字段不是我的要求

{
"LTRAMT":
{
"LTRAMT1":"0",
"LTRAMT2":"1624.96",
"LTRAMT3:"",
"LTRAMT4":"9901010"
.........
"LTRAMT20":"35776"

}
}

我不想向父级 LTRAMT 发送响应。 需要帮助来完成此要求。任何其他建议也会有所帮助 预先感谢。

c# .net dictionary dynamic system.reflection
1个回答
0
投票

如果使用

Newtonsoft
,则可以使用
JsonExtensionData
属性。 请参阅:JsonExtensionDataAttribute

JsonExtensionDataAttribute 指示 JsonSerializer 将类型上没有匹配字段或属性的属性反序列化到指定集合中。在序列化期间,此集合中的值将写回实例的 JSON 对象。

例如:

public class Tram
{
    [JsonExtensionData]
    public Dictionary<string, object> LTRAMT { get; set; }

    [JsonProperty("OTHER")]
    public string Other { get; set; }
}

注意:您必须使用

Dictionary<string, object>
而不是
Dictionary<string, string>

© www.soinside.com 2019 - 2024. All rights reserved.