Создание словаря любого объекта

#c# #dictionary

#c# #словарь

Вопрос:

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

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

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

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

Dictionary<String,id> .

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

Комментарии:

1. Dictionary<string, object> с гипсом, чтобы вытащить его? Это может иметь боксерские последствия, если вы собираетесь использовать типы значений.

2. каковы последствия бокса? Большинство object символов будут строками, но в некоторых случаях они могут list состоять из строк, которые вы видите.

3. @ThomasClayson: string ни List<string> один из них не является типом значения, поэтому никакого бокса не будет. (Выполните несколько поисковых запросов, чтобы узнать больше о боксе, если вы об этом не знаете …)

Ответ №1:

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

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

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

Ответ №2:

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

Ответ №3:

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

 Словарь s = новый словарь();
 Объект a = новый Int32();
 a = 1;
 Объект b = новый Double();
 b = 2,0;
 s.Добавить("a", a);
 s.Добавить ("b", b);
 Int32 v = Преобразовать.ToInt32(s["a"]);
 Double u = Преобразовать.ToDouble(s["b"]);
 Консоль.Строка записи(v   " "   u);

Ответ №4:

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

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