繁体   English   中英

在循环 C# 中创建 object

[英]Create object in a loop C#

我是 C# 的新手,我正在尝试通过遍历字符串数组来创建 object: indexKeys = ["A", "B", C"]

indexKeys的元素是事先不知道的。

我有一个 Object data ,其中一些键存在于indexKeys中:

data = {"A": "string1", "B": "string2", "C": "string3", "D": "string4"}

最终的 object token必须是以下序列化形式:

{
  "A": {
    "S": "string1"
  },
  "B": {
    "S": "string2"
  },
  "C": {
    "S": "string3"
  }
}

我下面的代码肯定是错误的,但我对 C# 中的数据类型感到困惑。

    private string getToken(Object data, string[] indexKeys){
        Token token = new Token{};
        foreach(string i in indexKeys){
            token.Add(i: {S: data[i]});
        }
        //return serialized token
    }

如何实现getToken以获得所需的结果?

您可以像这样使用Dictionary

 var dataDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(data);
   
  var response = new Dictionary<string, object>();

   foreach (var item in dataDictionary)
   {
       response.Add(item.Key, new { S = item.Value });
   }

   var json = JsonConvert.SerializeObject(response);

data为 object 并直接使用(带反射)时:

static string GetToken(object data, IEnumerable<string> indexKeys)
{
    var dict = new Dictionary<string, object>();

    foreach (var key in indexKeys)
    {
        dict.Add(key, new { S = data.GetType().GetProperty(key).GetValue(data, null).ToString() });
    }

    return JsonSerializer.Serialize(dict);
}

static void Main(string[] args)
{
    var indexKeys = new List<string>() { "A", "B", "C" };
    var data = new { A = "string1", B = "string2", C = "string3", D = "string4" };

    var result = GetToken(data, indexKeys);

    Console.WriteLine(result);
}

如果您将data作为字典而不是 object 提供:

static string GetToken(Dictionary<string, string> data, IEnumerable<string> indexKeys)
{
    var dict = new Dictionary<string, object>();

    foreach (var key in indexKeys)
    {
        dict.Add(key, new { S = data[key] });
    }

    return JsonSerializer.Serialize(dict);
}

static void Main(string[] args)
{
    var indexKeys = new List<string>() { "A", "B", "C" };

    var dataDict = new Dictionary<string, string>()
    {
        {  "A", "string1" },
        {  "B", "string2" },
        {  "C", "string3" },
        {  "D", "string4" }
    };

    var result = GetToken(dataDict, indexKeys);

    Console.WriteLine(result);
}

data为 object 但不使用反射时:

static string GetToken(object data, IEnumerable<string> indexKeys)
{
    var dataDict = JsonSerializer.Deserialize<Dictionary<string, object>>(JsonSerializer.Serialize(data));

    var dict = new Dictionary<string, object>();

    foreach (var key in indexKeys)
    {
        dict.Add(key, new { S = dataDict[key] });
    }

    return JsonSerializer.Serialize(dict);
}

static void Main(string[] args)
{
    var indexKeys = new List<string>() { "A", "B", "C" };
    var data = new { A = "string1", B = "string2", C = "string3", D = "string4" };

    var result = GetToken(data, indexKeys);

    Console.WriteLine(result);
}

所有这些解决方案都假定您的data对象/字典将包含indexKeys中的所有键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM