2011-12-25 51 views
0

我有一个dynamic说d。我通过执行以下操作增加了一些特性吧:如何在C#中为动态添加同名多个属性?

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

现在,当我有两个具有相同名称的属性,这显然会抛出异常。我想要允许所有属性,即使它们具有相同的名称。所以,字典是数据结构的错误选择。我正在考虑在C#中相当于JAVA的BAG。我找不到任何东西。什么是最好的方式去做这件事?

+2

请确认您在genral意义上使用“dynamic”(而不是C#“dynamic” - http://msdn.microsoft.com/en-us/library/dd264741.aspx)。 – 2011-12-25 06:02:22

+0

我正在使用C#动态...有不同的标签吗? – 2011-12-25 06:28:35

回答

5

你似乎完全混合了几个概念。

dynamic是一个使编译器生成后期绑定代码的触发器。虽然在编译时没有验证,但它遵循与普通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); 
} 

dynamic无关与IDictionaryLookup。 A dynamic变量可以是任意对象,例如int值。如果你使用dynamic,它的非常奇怪,你把它投到IDictionary接口。只需拨打Add,DLR将为您解决方法(就像我上面所做的那样)。

只有在与动态环境(脚本语言,COM等)互操作时,通常应该使用dynamic。如果你只使用C#代码 - 扔掉所有的动态东西,并使用常规的.NET集合。它将由编译器进行静态验证并且工作得更快。

例如,你可以使用一个Dictionary<string, ICollection<object>>有一个动态的字典:

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); 
} 

UPDATE

哦,是的,你可以尝试创建自己的DynamicObject实现,将使值成而不是重写现有价值。具体来说,你应该覆盖TrySetMember method。但首先想想如果你真的需要所有这些复杂的东西。

+0

是的,我认为他正在制作他自己的DynamicObject实现,并且之前只是使用Dictionary来支持它。 – CodingWithSpike 2011-12-25 22:41:41

+0

@ rally25rs似乎自从他接受之后你就猜到了。虽然我不明白如果'TryupMember'是不可变的,'Lookup'如何用来支持'TrySetMember'。你可以吗? – 2011-12-26 02:09:27

+0

啊,是的,你的权利。我有一段时间没有使用Lookup,并且忘记了Lookup本身是从另一个集合生成的并且保持不变。我想它就像一个字典,你可以在那里打电话。添加多次w /相同的密钥。哎呀...我其实会像你在你的例子中那样做,你有一个'Dictionary >'' – CodingWithSpike 2011-12-27 20:28:08

4

不太确定你想要的预期行为是什么,但是如果你想在相同的属性名称下保存多于一个项目,那么你可以使用System.Linq.Lookup类而不是Dictionary。

+0

我想添加类似prop1的东西:somevalue,prop1:somevalue2我的动态..将System.Linq.Lookup允许我这样做? – 2011-12-25 06:31:01

+0

它应该,是的。它的词类似于“Dictionary”,但不强制唯一键。当你得到一个键的值,比如'myLookup [“prop1”]',它会返回一个'IEnumerable '值,而不是像Dictionary那样只有一个值。 – CodingWithSpike 2011-12-25 06:38:29

+0

可爱的,我不知道它。 +1 – ivowiblo 2011-12-25 08:02:56