Как создать словарь, который содержит разные типы в С#

Мне нужно каким-то образом хранить пары ключ/значение, где значение может быть разных типов.

Мне нравится делать:

 int i = 12;
 string s = "test";
 double x = 24.1;

 Storage.Add("age", i);
 Storage.Add("name", s);
 Storage.Add("bmi", x);

И затем получить значения с помощью:

 int a = Storage.Get("age");
 string b = Storage.Get("name");
 double c = Storage.Get("bmi");

Как такое хранилище должно выглядеть так? Благодаря, Erik

Ответ 1

Ну, вы можете использовать Dictionary<string, dynamic> в С# 4/.NET 4 - но не в этом, вы не можете сделать это с точно указанным кодом, потому что нет типа, который неявно конвертируется в int, string и double. (Вы можете написать свой собственный, но вам придется перечислить каждый тип отдельно.)

Вы можете использовать Dictionary<string, object>, но тогда вам нужно будет отобразить результаты:

int a = (int) Storage.Get("age");
string b = (string) Storage.Get("name");
double c = (double) Storage.Get("bmi");

В качестве альтернативы вы можете сделать метод Get общим:

int a = Storage.Get<int>("age");
// etc

Ответ 2

Вы можете объявить словарь, содержащий только тип object, а затем передать свои результаты;.e.g.

Dictionary<string, object> storage = new Dictionary<string,object>();

storage.Add("age", 12);
storage.Add("name", "test");
storage.Add("bmi", 24.1);

int a = (int)storage["age"];
string b = (string)storage["name"];
double c = (double)storage["bmi"];

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

public class PersonInfo
{
    public int Age { get; set; }
    public string Name { get; set; }
    public double Bmi { get; set; }
}

И затем используйте это вложение Словаря... например.

PersonInfo person1 = new PersonInfo { Name = "test", Age = 32, Bmi = 25.01 };

int age = person1.Age;

и др.

Ответ 3

Почему бы не использовать:

Dictionary<string, object>

Вы можете создать метод расширения для их добавления, когда вы их получите:

public static class DictionaryExcetions
{
    public static T Get<T>(this Dictionary<string, object> instance, string name)
    {
        return (T)instance[name];
    }

}

var age = dictionary.Get<int>("age");

Ответ 4

Dictionary<string, object>

Ответ 5

Учитывая, что вы не хотите строго типизированную сбор данных, я бы подумал, что HashTable подходит для вашей ситуации. Вы также можете создать метод расширения, также как и другой плакат, предложенный для реализации Словаря.

например.

public static class StorageExtentions
{
    public static T Get<T>(this Hashtable table, object key)
    {
        return (T) table[key];
    }
}

Тогда ваш код будет выглядеть следующим образом:

int i = 12;
string s = "test";
double x = 24.1;
Hashtable Storage = new Hashtable();
Storage.Add("age", i);
Storage.Add("name", s);
Storage.Add("bmi", x);
int a = Storage.Get<int>("age");
string b = Storage.Get<string>("name");
double c = Storage.Get<double>("bmi");

Ответ 6

Вы можете использовать Dictionary<string,object>, а затем можете поместить в него все, что хотите. Вам нужно будет придать результаты правильному типу, когда вы их получите.

Глядя на ваш пример, хотя вы можете подумать, может ли простой класс хранить данные, может быть больше того, чего вы хотите, и обеспечить лучшую безопасность типов. Это зависит от того, есть ли у вас ограниченный набор вещей для размещения в классе или если вам нужно потенциально неограниченное/неизвестное хранилище словаря.

Ответ 7

Словарь, несомненно, является самым быстрым решением.

Другим способом может быть сохранение пользовательского класса, в котором вы можете сохранить фактическое значение и информацию о его типе