2011-12-25 59 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

相關問題