Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中向一个动态对象添加多个同名属性?_C#_C# 4.0_Data Structures_Dynamic - Fatal编程技术网

C# 如何在C中向一个动态对象添加多个同名属性?

C# 如何在C中向一个动态对象添加多个同名属性?,c#,c#-4.0,data-structures,dynamic,C#,C# 4.0,Data Structures,Dynamic,我有一个动态的说d。我将通过执行以下操作向其添加一些属性: ((IDictionary<String, Object>)d).Add("Propname", Propvalue); 现在,当我有同名的属性时,这显然会引发一个异常。我希望允许所有属性,即使它们具有相同的名称。因此,字典是数据结构的错误选择。我在考虑C语言中JAVA的BAG等价物。我什么也找不到。最好的方法是什么?不太确定您希望预期的行为是什么,但如果您希望在同一属性名下保存多个项目,则可以使用类而不是字典。您似乎完全

我有一个动态的说d。我将通过执行以下操作向其添加一些属性:

((IDictionary<String, Object>)d).Add("Propname", Propvalue);

现在,当我有同名的属性时,这显然会引发一个异常。我希望允许所有属性,即使它们具有相同的名称。因此,字典是数据结构的错误选择。我在考虑C语言中JAVA的BAG等价物。我什么也找不到。最好的方法是什么?

不太确定您希望预期的行为是什么,但如果您希望在同一属性名下保存多个项目,则可以使用类而不是字典。

您似乎完全混合了几个概念

动态是使编译器生成后期绑定代码的触发器。虽然它在编译时没有经过验证,但它遵循与普通c代码相同的规则。它不能有多值属性。在.NET?中的任何位置都可以有它们吗?。唯一的方法是使用集合值属性并向集合添加新值。大概是这样的:

dynamic obj = new ExpandoObject();
obj.SomeProperty = new List<object>();

obj.SomeProperty.Add(SomeValue);
obj.SomeProperty.Add(AnotherValue);

foreach(var somePropertyValue in obj.SomeProperty)
{
  DoSmth(somePropertyValue);
}
更新


哦,是的,您可以尝试创建自己的DynamicObject实现,在属性赋值时将值放入包中,而不是覆盖现有值。具体来说,您应该重写。但是首先想想你是否真的需要这些复杂的东西。

请确认你在genral中使用的是dynamic,而不是C dynamic-。我使用的是C dynamic…是否有不同的标记?我想在我的dynamic中添加类似于prop1:somevalue,prop1:somevalue2的东西。System.Linq.Lookup允许我这样做吗?应该,是的。它使用类似于字典的单词,但不强制使用唯一键。当你得到一个键的值时,比如myLookup[prop1],它会返回一个值的IEnumerable,而不是像字典那样只返回一个值。很好,我不知道+1Lookup不会有帮助-它是一个不可变的类。您需要使用其中一个方法重载来创建查找。是的,我假设他正在制作自己的DynamicObject实现,并且之前只是用字典来支持它。@rally25rs似乎是您自他接受以来猜到的。虽然我不明白如果TrySetMember是不可变的,那么如何使用查找来支持它。你能吗?啊,是的,你的权利。我已经有一段时间没有使用Lookup了,忘记了Lookup本身是从另一个集合生成的,并且保持不变。我把它想象成一本字典,你可以直接调用它。用同一个键添加多次。哎呀。。。实际上,我会像你在例子中那样做,你有一本字典
var dictionary = new Dictionary<string, ICollection<object>>();
dictionary["SomeProperty"] = new List<object>();

dictionary["SomeProperty"].Add(SomeValue);
dictionary["SomeProperty"].Add(AnotherValue);

foreach(var somePropertyValue in dictionary["SomeProperty"])
{
  DoSmth(somePropertyValue);
}