2011-01-31 2 views

ответ

5

Вы не можете.

Общие параметры используются и применяются компилятором, а Type - часть отражений, которые предназначены для работы с информацией о типе во время выполнения. Поэтому вы просто не можете определить, какой тип компилятора следует использовать, если у вас есть только System.Type.

Однако вы можете сделать наоборот:

public void Foo<T>() 
{ 
    Type t = typeof(T); 
} 

Так что, если вы действительно не нужно использовать Type в качестве параметра вы можете сделать следующее:

Foo<FooParam> MakeFoo<FooParam>() 
{ 
    return new Foo<FooParam>(); 
} 
+0

Да, я понимаю. Причина, по которой я несколько неохотно использую ваше предложение, заключается в том, что для класса без отражения есть конструктор, а также заводской метод, показанный выше. Заводский ментод предназначен для использования с отклонением, и поэтому ограничения могут быть установлены с использованием параметра типа. Представьте другой Get(), как указано выше, не принимая T в качестве аргумента, а набор строк. –

+0

@ Карло: Не могли бы вы показать свой настоящий код? –

2

Вы не можете сделать такие потому что «Тип» представляет собой набор отраженных метаданных классов, структур и/или перечислений.

"T" - это тип.

Вы можете дать тип в качестве аргумента с помощью отражения:

type.MakeGenericType(type).GetConstructor(Type.EmptyTypes).Invoke(null) 

Но я буду голосовать, чтобы добавить общий параметр «S» вместо входного параметра «Тип типа» для того, чтобы избежать использования отражение, которое бесполезно в этом случае, если вы это сделаете правильно!

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