我有一个dynamic
说d。我通过执行以下操作增加了一些特性吧:如何在C#中为动态添加同名多个属性?
((IDictionary<String, Object>)d).Add("Propname", Propvalue);
现在,当我有两个具有相同名称的属性,这显然会抛出异常。我想要允许所有属性,即使它们具有相同的名称。所以,字典是数据结构的错误选择。我正在考虑在C#中相当于JAVA的BAG。我找不到任何东西。什么是最好的方式去做这件事?
我有一个dynamic
说d。我通过执行以下操作增加了一些特性吧:如何在C#中为动态添加同名多个属性?
((IDictionary<String, Object>)d).Add("Propname", Propvalue);
现在,当我有两个具有相同名称的属性,这显然会抛出异常。我想要允许所有属性,即使它们具有相同的名称。所以,字典是数据结构的错误选择。我正在考虑在C#中相当于JAVA的BAG。我找不到任何东西。什么是最好的方式去做这件事?
你似乎完全混合了几个概念。
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
无关与IDictionary
或Lookup
。 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。但首先想想如果你真的需要所有这些复杂的东西。
是的,我认为他正在制作他自己的DynamicObject实现,并且之前只是使用Dictionary来支持它。 – CodingWithSpike 2011-12-25 22:41:41
@ rally25rs似乎自从他接受之后你就猜到了。虽然我不明白如果'TryupMember'是不可变的,'Lookup'如何用来支持'TrySetMember'。你可以吗? – 2011-12-26 02:09:27
啊,是的,你的权利。我有一段时间没有使用Lookup,并且忘记了Lookup本身是从另一个集合生成的并且保持不变。我想它就像一个字典,你可以在那里打电话。添加多次w /相同的密钥。哎呀...我其实会像你在你的例子中那样做,你有一个'Dictionary
不太确定你想要的预期行为是什么,但是如果你想在相同的属性名称下保存多于一个项目,那么你可以使用System.Linq.Lookup类而不是Dictionary。
我想添加类似prop1的东西:somevalue,prop1:somevalue2我的动态..将System.Linq.Lookup允许我这样做? – 2011-12-25 06:31:01
它应该,是的。它的词类似于“Dictionary”,但不强制唯一键。当你得到一个键的值,比如'myLookup [“prop1”]',它会返回一个'IEnumerable
可爱的,我不知道它。 +1 – ivowiblo 2011-12-25 08:02:56
请确认您在genral意义上使用“dynamic”(而不是C#“dynamic” - http://msdn.microsoft.com/en-us/library/dd264741.aspx)。 – 2011-12-25 06:02:22
我正在使用C#动态...有不同的标签吗? – 2011-12-25 06:28:35