Да, но вам придется использовать отражение, чтобы построить фактический тип, который вы ищете.
Сначала нужно получить открытый универсальный с помощью оператора typeof
:
var openType = typeof(GenericClass<>);
Далее вам нужно создать конкретный шаблон, который вам нужен. Допустим, ваш требуемый тип T хранится в переменной type
:
var closedType = openType.MakeGenericType(type);
Наконец, используйте отражение, чтобы создать экземпляр этого типа.
object instance = Activator.CreateInstance(closedType);
Однако, как отметил xanatos в комментариях, вы должны знать, что это приводит к члену типа object
. Чтобы иметь возможность манипулировать объектом без отражения, у вас есть два варианта.
- Вы можете создать родительский класс
GenericClass
, из которого происходит GenericClass<T>
, и включить в него методы, которые являются общими для всех. (т. е. GenericClass
содержит членов, которым не нужно использовать T
.
- Как Ingenu упоминал в комментариях к вопросу, вы можете создать интерфейс
IInterface
, а затем добавить ограничение на T
, where T : IInterface
. Затем вы можете привести instance
к GenericClass<IInterface>
и манипулировать им таким образом. Очевидно, type
должен реализовывать IInterface
в этом случае.
Конечно, вы также можете просто сохранить ссылку object
и манипулировать ею, используя только отражение, или использовать dynamic
для поздней привязки вызовов любого метода - однако это использует отражение под капотом.