Как мне получить тип из этой общей ситуации?

#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);
    }

}