#c# #generics
#c# #общие
Вопрос:
Я пытаюсь написать общий базовый класс, который позволит подклассам передавать интерфейс в качестве типа, а затем использовать методы вызова базового класса в общем, но я не могу понять, как это сделать…
public class BaseController<T> : Controller where T : IPageModel
{
public virtual ActionResult Index()
{
IPageModel model = new T.GetType();
return View(model);
}
}
Это не компилируется, я ошибся концом флешки, когда дело доходит до дженериков?
Ответ №1:
Я думаю, вы хотите:
public class BaseController<T> : Controller where T : IPageModel, new()
{
public virtual ActionResult Index()
{
IPageModel model = new T();
return View(model);
}
}
Обратите внимание на new()
ограничение на T
. (См. MSDN об общих ограничениях для получения дополнительной информации.)
Если вам действительно нужна Type
ссылка, соответствующая T
, вы бы использовали typeof(T)
— но я не думаю, что вам это нужно в данном случае.
Комментарии:
1. Спасибо, Джон, что делает этот новый бит в конце? Убедитесь, что тип «обновлен» при создании экземпляра базового класса?
2. @Pete2k: Нет — здесь не происходит наследования. Для этого просто требуется, чтобы
T
был конструктор без параметров. Я отредактирую ссылку в своем ответе.
Ответ №2:
Вы должны сделать, как показано ниже, чтобы включить создание экземпляра:
public class BaseController<T> : Controller where T :IPageModel,new()
{
public virtual ActionResult Index()
{
IPageModel model = new T();
return View(model);
}
}