ash*_*ina 0 c# dynamic data-structures c#-4.0
我有dynamic发言权.我通过执行以下操作向其添加一些属性:
((IDictionary<String, Object>)d).Add("Propname", Propvalue);
Run Code Online (Sandbox Code Playgroud)
现在,当我拥有相同名称的属性时,这显然会引发异常.我想允许所有属性,即使它们具有相同的名称.因此,字典是数据结构的错误选择.我在考虑使用C#中的BAG相当于JAVA.我找不到任何东西.解决这个问题的最佳方式是什么?
你似乎完全混合了几个概念.
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);
}
Run Code Online (Sandbox Code Playgroud)
dynamic与IDictionaryor 无关Lookup.甲dynamic变量可以是任意物体,例如一个int值.如果你使用dynamic,你把它投射到界面是很奇怪的IDictionary.只需致电Add,DLR将为您解决该方法(就像我上面所做的那样).
通常dynamic只有在与动态环境(脚本语言,COM等)进行互操作时才能使用.如果你只使用c#代码 - 扔掉所有动态的东西并使用常规的.NET集合.它将由编译器进行静态验证,并且工作得更快.
例如,您可以使用a 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);
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
哦,是的,你可以尝试创建自己的DynamicObject实现,在属性赋值时将值放入包中,而不是覆盖现有值.具体来说,您应该重写TrySetMember方法.但首先想想你是否真的需要所有这些复杂的东西.
| 归档时间: |
|
| 查看次数: |
1467 次 |
| 最近记录: |