我有一個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