2011-10-27 2 views
2

Что я хочу - это возможность хранить имя, пары объектов.Создание словаря любого объекта

В отличие от objC C# Dictionary требуется тип. В objC я бы использовал id для обозначения «любого объекта».

Как мне управлять этим в C#.

Так что я ищу это:

Dictionary<String,id>.

Извините, если это действительно так!

+3

'Словарь <строка, объект>' с приложением, чтобы получить его? Могут иметь последствия для бокса, если вы собираетесь использовать типы значений. –

+0

Что такое боксерские последствия? Большая часть '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' –

+0

@ThomasClayson: Ни 'string', ни' List '- тип значения, поэтому никакого бокса не будет. (Сделайте несколько поисков, чтобы узнать больше о боксе, если вы не знаете об этом ...) –

ответ

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) {...}, которая является запахом кода.

Возможно ли какая-либо упаковка в общий класс? Это позволит вам указать некоторые общие операции над ним (потому что вам, вероятно, нужны некоторые общие операции, если вам нужно, чтобы они находились в одном и том же dict). Например, что-то вроде (рассмотрим его как псевдокод):

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 или любого обычая.

Смежные вопросы