C# - 动态地添加对象(添加动态属性名称)

18 浏览
0 Comments

C# - 动态地添加对象(添加动态属性名称)

我正在尝试创建一些动态的ExpandoObject,但遇到了一个问题。\n由于我不知道对象中这些不同属性的名称应该是什么,所以无法像这样操作:\n

var list = new ArrayList();
var obj = new ExpandoObject();
obj.ID = 1,
obj.Product = "Pie",
obj.Days = 1,
obj.QTY = 65
list.Add(obj);

\n让我解释一下我的情况:我希望从一个随机的数据库中获取数据(我不知道是哪个数据库,但可以根据从用户界面得到的信息建立连接字符串),因此我不知道我需要获取什么数据。这可能是一个数据库表的示例:\nTABLE Sale\n

    \n

  • ID: int,
  • \n

  • Product: nvarchar(100),
  • \n

  • Days: int,
  • \n

  • QTY: bigint
  • \n

\n这可能是另一个示例:\nTABLE Foobar\n

    \n

  • Id: int,
  • \n

  • Days: int
  • \n

  • QTY: bigint
  • \n

  • Product_Id: int
  • \n

  • Department_Id: int
  • \n

\n如你所见,我不知道数据库的样子(这是100%匿名的,因此需要100%动态),我想要返回的数据应该像一个构造良好的JSON,就像这样:\n[\n {\n \"ID\": 1,\n \"Product\": \"Pie\"\n \"Days\": 1,\n \"QTY\": 65\n },\n {\n \"ID\": 2,\n \"Product\": \"Melons\"\n \"Days\": 5,\n \"QTY\": 12\n }\n]\n\n或者,对于另一个示例:\n[\n {\n \"ID\": 1,\n \"Days\": 2,\n \"QTY\": 56,\n \"Product_Id\": 5,\n \"Department_Id\": 2\n }\n {\n \"ID\": 2,\n \"Days\": 6,\n \"QTY\": 12,\n \"Product_Id\": 2,\n \"Department_Id\": 5\n }\n]\n\n我尝试过使用这些ExpandoObject,但似乎不能工作,因为我无法像问题开头所示的那样操作(我不知道属性的名称)。有没有办法让我这样说:\n

var obj = new ExpandoObject();
var propName = "Product";
var obj.propName = "Pie"
Console.WriteLine("Let's print!: " + obj.Product);
//OUTPUT
Let's print!: Pie

\n有没有人有解决办法,或者只是对可能解决这个问题的结构有指导?

0
0 Comments

问题的出现的原因:

问题是如何动态添加对象的属性,并在循环中访问这些属性。这可能是因为在某些情况下,我们无法在编译时确定对象的属性名称,因此需要在运行时动态添加属性。

解决方法:

使用dynamic关键字,然后将其转换为IDictionary类型,以便循环访问属性。以下是解决问题的代码示例:

dynamic obj = new ExpandoObject();
obj.Product = "Pie";
obj.Quantity = 2;
// Loop through all added properties       
foreach(var prop in (IDictionary)obj)
{
  Console.WriteLine(prop.Key + " : " + prop.Value);
}

使用上述代码,我们首先创建了一个dynamic对象obj,并使用ExpandoObject来实例化它。然后,我们可以像普通对象一样动态添加属性,例如Product和Quantity。在循环中,我们将obj对象转换为IDictionary类型,并通过遍历其中的每个属性,输出属性的名称和值。

此外,文章还提供了一个fiddle链接,可以在其中运行和测试代码。该链接为:https://dotnetfiddle.net/yFLy2u

这是解决问题的一种方法,但是根据问题的具体情况,可能还有其他更适合的解决方案。

0
0 Comments

C#中动态添加对象(动态添加属性名)的问题是因为使用了ExpandoObject类,该类实现了IDictionary接口,可以通过以下方法解决该问题:

IDictionary obj = new ExpandoObject();
var propName = "Product";
obj[propName] = "Pie";
Console.WriteLine("Let's print!: " + obj[propName]);
// Verify it's working
Console.WriteLine("Let's print again!: " + ((dynamic)obj).Product);

以上代码利用ExpandoObject类动态添加了一个名为"Product"的属性,并给其赋值为"Pie"。通过obj[propName]可以获取该属性的值,通过((dynamic)obj).Product也可以获取该属性的值。

0
0 Comments

C# - 动态添加对象(动态添加属性名称)

有时候我们需要在运行时动态地添加对象的属性,这篇文章介绍了一种使用List<Dictionary<string, object>>的方法来实现这个需求。

首先,我们创建一个List,其中每个Dictionary都包含我们想要序列化的名称/值对。然后,使用Json.NET(或者较不灵活的JavaScriptSerializer)将其序列化为JSON。

下面是一个示例代码:

var list = new List<Dictionary<string, object>>();
// 使用字典初始化器构建字典项
list.Add(new Dictionary<string, object> { { "ID", 1 }, {"Product", "Pie"}, {"Days", 1}, {"QTY", 65} });
// 逐步构建字典项
var dict = new Dictionary<string, object>();
dict["ID"] = 2;
dict["Product"] = "Melons";
dict["Days"] = 5;
dict["QTY"] = 12;
list.Add(dict);
Console.WriteLine(JsonConvert.SerializeObject(list, Formatting.Indented));
Console.WriteLine(new JavaScriptSerializer().Serialize(list));

上述代码输出的结果如下:

[
  {
    "ID": 1,
    "Product": "Pie",
    "Days": 1,
    "QTY": 65
  },
  {
    "ID": 2,
    "Product": "Melons",
    "Days": 5,
    "QTY": 12
  }
]
[{"ID":1,"Product":"Pie","Days":1,"QTY":65},{"ID":2,"Product":"Melons","Days":5,"QTY":12}]

然而,在某些情况下,我们可能无法提前获取所有的属性值,而需要在运行时通过循环来获取。下面是一个示例代码:

var valueList = allRowValues;
var clumn = allClumnNames;
var dict = new Dictionary<string, object>();
for (int i = 0; i < clumn.Length; i++)
{
    dict[clumn[i]] = valueList[i];
}
list.Add(dict);

以上就是动态添加对象属性的方法。如果你在处理JSON字符串时出现了类似于`[{"ID":1,"Product":"Honning","Days":1,"QTY":65}]`的问题,可能是因为你进行了双重序列化,你可以参考这个问题的解答来解决这个问题。

希望本文能对你有所帮助,感谢你的阅读。

0