Чтобы создать закрытый универсальный тип, вы можете сделать это:
var openGenericType = typeof(LinkedEntityProvider<,>);
var closedGenericType = openGenericType.MakeGenericType(typeof(TObj), entityType);
var instance = Activator.CreateInstance(closedGenericType);
Первая строка получает открытый тип, т.е. без универсальных параметров. Затем мы передаем параметры в MakeGenericType
для получения чего-то похожего на typeof(LinkedEntityProvider<TObj, TRes>)
.
Получив это, мы можем создать экземпляр, используя Activator.CreateInstance
. Если конструктор объекта принимает какие-либо параметры, вам придется передать их в Activator.CreateInstance
, например:
var instance = Activator.CreateInstance(closedGenericType, new object[] { constructorParameter1, constructorParameter2 });
Обратите внимание, что, поскольку нет способа узнать тип, который создается во время компиляции,Activator.CreateInstance
возвращает object
.