2011-10-27 43 views
2

我想要的是存儲名稱,對象對的能力。創建任何對象的字典

不像objC c#的Dictionary需要類型。在objC中,我會使用id來表示「任何對象」。

我該如何在c#中管理這個。

所以,我正在尋找的是:

Dictionary<String,id>

對不起,如果這是非常基本的!

+3

'字典<字符串,對象>'與演員把它拿出來?如果你打算使用值類型,可能會產生拳擊影響。 –

+0

什麼是拳擊影響?大部分「對象」都是字符串,但在少數情況下,它們可能會列出你看到的字符串。 –

+0

@ThomasClayson:既不是'字符串也不是'列表'是一個值類型,所以不會有任何涉及的拳擊。 (做一些搜索,以瞭解更多關於拳擊的信息,如果你不知道的話......) –

回答

4

沒有進入很多faffery的交談多強類型對象的列表,實現這一目標的最簡單的方法是用Dictionary<string, object>並投出你的對象類型,因爲你需要它:

int i = (int)myDictionary["Age"]; 
string n = (string)myDictionary["Name"]; 

有幾個動態選擇這裏如ExpandoObject

http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx

如果你去的對象字典的方法,注意boxing on value types。使用動態方法不會產生裝箱問題,但需要運行時分辨率,因此性能會稍微受到影響。

沒有什麼是免費的,但總的來說,你不應該看到這種小的開銷的影響。

0

如果拆箱是一個問題,.NET 4中總會有新的動態類型。

0

不知道如果我理解正確的你,但你可以做如下:

 

    Dictionary s = new Dictionary(); 
    Object a = new Int32(); 
    a = 1; 
    Object b = new Double(); 
    b = 2.0; 
    s.Add("a", a); 
    s.Add("b", b); 
    Int32 v = Convert.ToInt32(s["a"]); 
    Double u = Convert.ToDouble(s["b"]); 
    Console.WriteLine(v + " " + u); 

-1

問這可能表明可能會有一些不好的設計背後隱藏着這一點。它總是當你需要一個異構對象的集合時。

由於不知道集合中的對象類型,您總是需要進行某種類型的檢查,如if (dictionary["xy"] is string) {...}這是一種代碼異味。

將某種包裝到普通類中是否可以選擇?這將允許你指定一些常用操作(因爲如果你需要它在同一個詞典中,你可能需要一些常用操作)。例如像(認爲它是僞代碼):

class Base 
{ 
    bool IsCollection; 
} 

class StringItem : Base 
{ 
    string Contents; 
    IsCollection = false; 
    override ToString() { return this.Contents; } 
} 

class ListItem : Base 
{ 
    List<StringItem> Contents; 
    IsCollection = true; 
    override ToString() { return string.Join(",", this.Contents.ToArray() } 
} 

那麼你可能會對基礎定義的Dictionary<string, Base>和使用操作,如ToString或任何自定義。