2011-12-23 2 views
0

У меня есть следующая проблема:Список различных родовых типов, динамическое литье

  • Мне нужно хранить общие объекты с различными параметрами типа, что-то вроде javish Sth<A,?>,
  • «?» типы, как правило, примитивы, так что на самом деле не расширяемая/изменчива
  • Мне нужно выполнить некоторые методы по каждому элементу моего списка
    • различные методы для различных типов или, по крайней мере, различные перегрузки этих методов

Хотя я не знаю, как хранить такие типы, допустим, для простоты List<object>.

Я мог бы хранить тип в вопросе где-нибудь (List<KeyValuePair<Type,object>>), получая его с typeof(), но тогда, как я могу вернуть объект обратно в требуемый тип? Что-то вроде

foreach(var entry in myList) 
{ 
    var obj = (Sth<A, entry.Key>) entry.Value; 
    myMethod(obj); //This can have overloads for object, Sth<A,int>, Sth<A,string>, 
        // etc. Generally, I need a correct type of obj here. 
} 

Конечно myMethod<T> общего метод, библиотеки слишком много перегрузок, чтобы если-иначе он с obj is Sth<A, uint> ...

Я думаю, что я мог бы создать новый объект на основе entry.Key, а затем заполнить

Возможны ли такие комбинации с типами?

Я считаю, что ответ заключается в правильном создании myList, но я не знаю, как это сделать.

Любая помощь будет оценена!

С Рождеством :)

+0

Что делает 'myMethod'? В какой-то момент вам не придется бросать объект в нечто значимое, чтобы использовать его? –

+0

Ну, этот 'myMethod' на самом деле не мой;] Проблема в том, что я не знаю источников и не могу сказать, какие типы важны. –

ответ

6

Если вы используете C# 4, вы можете использовать dynamic для этого:

foreach (KeyValuePair<A, object> entry in myList) 
{ 
    dynamic value = entry.Value; 
    myMethod(value); 
} 

Разрешение перегрузки теперь будет выполняться во время выполнения на основе выполнения времени тип value.

+0

Это сделало трюк. Спасибо за помощь (и извините за поздний ответ), эта динамичная вещь для меня нова. Но, похоже, это именно то, что я искал. –

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