2013-06-21 4 views
0

Я хочу создать словарь, где тип ключа Integer и тип значения является тип класса я исполняемой в данный момент вКак создать словарь с известным типом значений?

Я попытался следующие:.

Dim col as new Dictionary(Of Integer, Me.GetType()) 

но я я получаю сообщение о том, что `keyword не называет тип.

Как создать словарь на основе типа исполняемого класса?

+0

[MakeGenericType] (http://msdn.microsoft.com/en-us/library/system.type.makegenerictype.aspx)? –

+0

@AlexeiLevenkov Как мне добавить слова в словарь? Он никогда не создает словарь, а только тип. – AngryHacker

+0

Вы получаете тип, чем конструктор вызовов, чем добавляете элементы (к сожалению, я понятия не имею, как выразить это в VB.Net, я могу дать образец C#) ... Но я надеюсь, что кто-то может предложить более разумное решение. В C# тоже будет проблема с выражением результирующего типа в коде (я думаю, что «IDictionary» может быть единственным вариантом) - не уверен в VB.Net. –

ответ

4

C# образец создания словаря int для типа.

Используемые методы:

Проблема в основном, чтобы выразить полученный тип в некоторой степени тип-безопасным способом. В случае Dictionary можно обратиться к IDictionary или продолжать использовать отражение для управления объектами.

Это также может быть возможным, чтобы каким-то образом выразить большинство манипуляций с обобщенным кодом, который вызывается более отражения с MakeGenericMethod

Пример:

var myType = typeof(Guid); // some type 

    // get type of future dictionary 
    Type generic = typeof(Dictionary<,>); 
    Type[] typeArgs = { typeof(int), myType }; 
    var concrete = generic.MakeGenericType(typeArgs); 

    // get and call constructor 
    var constructor = concrete.GetConstructor(new Type[0]); 
    var dictionary = (IDictionary)constructor.Invoke(new object[0]); 

    // use non-generic version of interface to add items 
    dictionary.Add(5, new Guid()); 
    Console.Write(dictionary[5]); 

    // trying to add item of wrong type will obviously fail 
    // dictionary.Add(6, "test"); 
+0

Что это линия? 'var constructor = concrete.GetConstructor (новый тип [0]);' What Type [0] ??? – AngryHacker

+0

@AngryHacker 'GetConstructor' требует массив' Type', определяющий типы каждого аргумента конструктора (чтобы найти совпадение). 'new Type [0]' - массив из 0 элементов. Я ищу конструктор с 0 параметрами. Возможно, вам придется настроить это, если вам нужны другие конструкторы. –

0

Просто используйте имя класса Dim col as new Dictionary(Of Integer, MyClass)

Об одном сторона не использует целое число, так как ваш ключ может запутаться, поскольку словарь также использует целое число для индекса. Если ключи должны быть целыми целыми числами, вам может быть лучше подан список.