Создание словаря любого объекта - PullRequest
2 голосов
/ 27 октября 2011

Что мне нужно, так это возможность хранить имя, пары объектов.

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

Как бы я справился с этим в c #.

Итак, что я ищу:

Dictionary<String,id>.

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

Ответы [ 4 ]

4 голосов
/ 27 октября 2011

Не вдаваясь в подробности разговоров с несколькими строго типизированными списками объектов, самый простой способ добиться этого - с помощью 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

Если вы используете подход словаря объектов, обратите внимание на бокс для типов значений . Использование динамического подхода не будет иметь последствий для бокса, но потребует разрешения во время выполнения, поэтому на производительность снова будет оказано незначительное влияние.

Ничего не дается бесплатно, но в общем и целом вы не должны видеть последствия этих незначительных накладных расходов.

0 голосов
/ 27 октября 2011

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

Из-за незнания типа объектов, которые есть в коллекции, вам всегда нужно выполнять какую-то проверку типа, например 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 или любой другой.

0 голосов
/ 27 октября 2011

Не уверен, правильно ли я вас понял, но вы можете сделать следующее:


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

0 голосов
/ 27 октября 2011

В .NET 4 всегда есть новый динамический тип, если распаковка является проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...