2011-12-25 14 views
0

私はdynamicといいます。私は、次の操作を行って、そこにいくつかのプロパティを追加してい: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)。 –

+0

私はC#のダイナミックを使用しています...そこには別のタグがありますか? –

答えて

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

dynamicIDictionaryまたはLookupとは何の関係もありません。変数dynamicは任意のオブジェクトにすることができます。たとえば、intの値です。 dynamicを使用している場合はが非常にで、それはIDictionaryインターフェイスにキャストするのが奇妙です。ちょうどAddに電話をかけると、DLRはあなたのために方法を解決します(上記のように)。

動的環境(スクリプト言語、COMなど)と相互運用する場合にのみ、通常dynamicを使用する必要があります。 C#コードでしか動作しない場合、すべての動的なものを捨てて、通常の.NETコレクションを使用してください。コンパイラによって静的に検証され、より速く動作します。ああ、はい、あなたはに値を置く独自のDynamicObjectの実装を作成しようとすることができ

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

たとえば、あなたは、動的な辞書を持っているDictionary<string, ICollection<object>>を使用することができます既存の値を上書きするのではなく、プロパティの割り当て時に袋に入れます。具体的には、TrySetMember methodを上書きする必要があります。しかし、まずこの複雑なものすべてが本当に必要な場合は、まず考えてみてください。

+0

ええ、私は彼が自身のDynamicObject実装を作っていると思っていましたが、以前は辞書でそれをサポートしていました。 – CodingWithSpike

+0

@ rally25rs彼は受け入れて以来、あなたが推測したようです。 'TrySetMember'が不変の場合、' Lookup'をどのように使用するのか理解できません。あなたはできる? –

+0

ああ、そうです、あなたの権利。私はしばらくのうちにルックアップを使用していなかったし、ルックアップ自体が別のコレクションから生成され、不変のままであることを忘れてしまった。私はあなたがちょうど呼び出すことができるディクショナリのようにそれを考えていた。同じキーで複数回追加。 oops ...私は実際にあなたがあなたの例で行ったように、 'Dictionary > – CodingWithSpike

4

予想される動作が何であるかは不明ですが、複数のアイテムを同じプロパティ名で保存したい場合は、辞書の代わりにSystem.Linq.Lookupクラスを使用できます。

+0

私はprop1:somevalue、prop1:somevalue2のようなものを私のダイナミックに追加したいと思っています.System.Linq.Lookupは私にそれを許可しますか? –

+0

そうでしょう。 'Dictionary'と似た言葉ですが、ユニークなキーを強制しません。 'myLookup [" prop1 "]'のようなキーの値を取得すると、辞書のように1つの値の代わりに値のIEnumerable を返します。 – CodingWithSpike

+0

ラブリー、私はそれを知らなかった。 +1 – ivowiblo

関連する問題