У меня есть метод, который принимает общий класс TViewModel, например:
Page GetPage<TViewModel>() where TViewModel : class, IViewModelBase;
В моем классе я получаю тип элемента, который выбрал пользователь (из списка навигации), вот так:
var viewModel = item.TargetType;
Этот тип всегда будет моделью представления, унаследованной от IViewModelBase.
Когда я вызываю эту следующую строку, мне нужно иметь возможность передать тип viewModel. Я пытаюсь сделать
var page = Navigator.GetPage<viewModel>();
Но я получаю следующую ошибку:
viewModel is a variable but is being used like a type.
Есть ли способ передать тип viewModel методу GetPage?
Если не единственный способ, которым я могу это сделать, - это иметь оператор switch, который проверяет имя типа viewModel и жестко кодирует правильный TViewModel в вызове GetPage.
Например что-то вроде этого:
switch (viewModel.Name)
{
case "TaskViewModel":
page = Navigator.GetPage<TaskViewModel>();
break;
case "TaskEditViewModel":
page = Navigator.GetPage<TaskEditViewModel>();
break;
}
Я попробовал решение, для которого это было помечено как дубликат, и этот ответ не относится к моему. Я получаю ошибку
Object does not match target type
Запущенный код выглядит так:
MethodInfo method = typeof(Navigator).GetMethod("GetPage");
MethodInfo generic = method.MakeGenericMethod(viewModel);
generic.Invoke(this, null);





Насколько я знаю, общие методы или класс генерируются во время компиляции. В методе GetPage () в качестве универсального вы можете передать параметр любому классу, который реализует IViewModelBase. Вы можете передать только параметр viewModel, который вы можете сделать следующим образом:
Page GetPage<TViewModel>(TViewModel viewModel) where TViewModel : class, IViewModelBase;
а затем вы можете использовать это так:
GetPage<ImplementerIViewModelBase>(viewModel);
Где viewModel имеет тип ImplementerIViewModelBase.
Если вам нужно знать тип viewModel, вы можете использовать методы typeof () или GetType (), которые возвращают экземпляр Type. См. Пример:
var type = viewModel.GetType();
/* some action */
if (type is ImplemeterIViewModelBase)
{
/* some action */
}
Вы также можете определить общий метод и реализовать его для каждого типа:
//define
Page GetPage<TViewModel>(TViewModel viewModel) where TViewModel : class,
IViewModelBase;
//Implement
Page GetPage<ImpolementerIViewModelBase1>(ImplementerIViewModelBase1
viewModel)
{
/* some implementation */
}
Page GetPage<ImpolementerIViewModelBase2>(ImplementerIViewModelBase2
viewModel)
{
/* some implementation */
}
так далее
В этом случае вы, вероятно, захотите передать аргумент
Typeвместо использования дженериков. В частности, универсальные шаблоны ожидают имя типа, а не переменную типа классаType.