C# - 动态地添加对象(添加动态属性名称)
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,
- Product: nvarchar(100),
- Days: int,
- QTY: bigint
\n
\n
\n
\n
\n这可能是另一个示例:\nTABLE Foobar\n
- \n
- Id: int,
- Days: int
- QTY: bigint
- Product_Id: int
- Department_Id: int
\n
\n
\n
\n
\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有没有人有解决办法,或者只是对可能解决这个问题的结构有指导?
问题的出现的原因:
问题是如何动态添加对象的属性,并在循环中访问这些属性。这可能是因为在某些情况下,我们无法在编译时确定对象的属性名称,因此需要在运行时动态添加属性。
解决方法:
使用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。
这是解决问题的一种方法,但是根据问题的具体情况,可能还有其他更适合的解决方案。
C#中动态添加对象(动态添加属性名)的问题是因为使用了ExpandoObject类,该类实现了IDictionary
IDictionaryobj = 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也可以获取该属性的值。
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}]`的问题,可能是因为你进行了双重序列化,你可以参考这个问题的解答来解决这个问题。
希望本文能对你有所帮助,感谢你的阅读。