Я не совсем уверен, что понимаю, что вам нужно, но я считаю, что вопрос заключается в том, как взять открытый универсальный тип и сделать его закрытым универсальным типом.
, если это так, попробуйте этомагия отражения:
var repository = Activator.CreateInstance(typeof(Repository<>).MakeGenericType(modelType));
или, если вы используете контейнер или что-то в этих строках, разрешите получившийся закрытый универсальный тип из вызова MakeGenericType из контейнера, а не с помощью Activator.CreateInstance.в любом случае, вам следует получить экземпляр того, что вы хотите.
это то, что вы ищете?
РЕДАКТИРОВАТЬ: в ответ на вопрос Оливье Жако:Descombes, вот некоторые мысли и код:
в идеале, я бы использовал некоторые встроенные возможности вашего ioc-контейнера по выбору или что-то вроде этого кода отражения, чтобы зарегистрировать открытый универсальный тип с контейнером или чем-то еще.выберите закрытые типы (возможности контейнеров различаются).затем при использовании универсального типа в качестве зависимости вы можете сделать это, зная тип, который вы намереваетесь использовать в качестве универсального параметра, и разрешить известный тип из контейнера (в большинстве случаев вы точно знаете, какой тип вы ищете, когдаВы действительно используете это).если это не вариант из-за неиспользования контейнера или его ограниченных возможностей, а ситуация немного отличается, и вы запрашиваете параметр общего типа, который вы знаете во время компиляции, у вас может быть метод, похожий на этот:
Repository<T> GetRepository<T>()
{
return Activator.CreateInstance(typeof(Repository<T>));
}
Если это действительно такая ситуация, как вопрос, где это неизвестно, то это сложный вопрос.одна мысль, которая приходит на ум, - это иметь неуниверсальный класс репозитория (или любой другой тип, который подходит этому шаблону) и сделать класс с подклассом универсального типа неуниверсальным (но он не будет работать, если методы зависят от универсального типа, что они, вероятно, и делают) и приводят результат к базовому, неуниверсальному типу.возможно, очень мало ситуаций, когда это действительно сработало бы.
другой ответ может заключаться в том, чтобы сделать класс неуниверсальным и вместо этого просто иметь общие параметры для методов.это то, что я сделал с моими репозиториями, и я думаю, что в любом случае это лучший способ сделать это и упростить зависимости, имея только один тип репозитория вместо столько типов репозиториев, сколько у вас есть постоянные классы.