2013-08-26 4 views
0

У меня есть объект LazyLoader < T>. Он подключается к ORM для загрузки данных для типа T, когда это необходимо. Оно работает.Создать список <T> используя объект типа вместо T

LazyLoader < T> наследуется от ILazyLoader.

Задача: создать заводский класс, который может загружать общий тип из типа объекта.

Как и в,

public ILazyLoader CreateLazyLoader(int id, Type typeToLoad) 
{ 
    return new LazyListLoader<typeToLoad>(id); 
} 

Проблема: < typeToLoad> не принимает объект Type. Как преобразовать Type < typeToLoad> во что-то, что будет работать как < T> где T является typeToLoad?

+1

Это должен быть общий тип аргумента, а не параметр. 'public ILazyLoader CreateLazyLoader (int id) {return new LazyListLoader (id); } ' – asawyer

+0

Если вы не знаете тип во время компиляции, это довольно большой флаг, с которого вы не должны использовать ORM. Подавляющее большинство функций, которые они предлагают, либо требуют, чтобы вы знали типы, с которыми имеете дело во время компиляции, либо не можете предоставить вам какие-либо преимущества, чтобы не использовать ORM, если вы не знаете эту информацию. – Servy

+1

@asawyer: Я не думаю, что вы действительно можете сказать это так окончательно без какого-либо контекста. Хотя дженерики, безусловно, лучше подходят для типов, известных во время компиляции, это далеко не редкостное требование, и в некоторых случаях это оправдано. –

ответ

9
var llType = typeof(LazyListLoader<>).MakeGenericType(typeToLoad); 
return (ILazyLoader)Activator.CreateInstance(llType, id); 
4

Попробуйте следующее

var unboundType = typeof(LazyListLoader<>); 
var boundType = unboundType.MakeGenericType(typeToLoad); 
return (ILazyLoader)Activator.CreateInstance(boundType, new[] {id}); 
Смежные вопросы