Универсальный класс контроллеров с наследованием .NET - PullRequest
2 голосов
/ 08 ноября 2019

Я делаю собственный класс контроллера, от которого все другие классы контроллеров будут наследоваться в .Net Framework 4.8, Web API

public class BaseApiController<T> where T: class, ApiController
{
    protected T service;

    public BaseApiController(T service)
    {
        this.service = service;
    }
}

Это дает ошибку времени компиляции

Ошибка CS0450 «ApiController»: невозможно указать как класс ограничения, так и ограничение «класс» или «структура»

Я знаю, что мне не хватает мелких деталей с правильным синтаксисом.
T - это услуга, индивидуальная для каждого контроллера, и я хочу убедиться, что это всегда ссылочный тип. Я также хочу наследовать от основного ApiController класса.

Если я делаю это так, ошибок нет (Это работает для меня):

public class BaseApiController<T> : ApiController
{
    protected T service;

    public BaseApiController(T service)
    {
        this.service = service;
    }
}

Но я хочудополнительная логика T для ссылочного типа.

Я хочу использовать его следующим образом, например:
Примечание. Вот как я его использую, и он работает.

[Authorize]
[RoutePrefix("api/[controller]")]
public class MyOtherController : BaseApiController<IMyOtherService>
{
    public MyOtherController(IMyOtherService myOtherService) : base(myOtherService)
    {

    }

    [HttpPost]
    public IHttpActionResult DoSomething(Model requestModel)
    {
        var result = this.service.SetPaymentStatusUK(model: requestModel);
        return Ok();
    }
}

Я просто хочу знать, как добавить T проверьте тип ссылки в классе BaseApiController.

1 Ответ

3 голосов
/ 08 ноября 2019

Если я правильно понимаю ваш вопрос, проблема в том, что вы применили ApiControler как ограничение к T. Когда вы хотели применить его как предка BaseApiController<T>.

Как ограничение ApiControler оно недопустимо, поскольку вы уже применили ограничение class. class включает все классы, включая ApiControler и все остальные классы, которые еще не написаны. Это менее ограничительное ограничение ApiControler. Вы используете только определенный тип или интерфейс в качестве ограничения, если вы хотите, чтобы все возможные T имели абсолютно положительное наследование / реализацию интерфейса.

Согласно Синтаксическим примерам , вы сначала наследуете, затемВы сдерживаете. Итак:

public class BaseApiController<T> : ApiController where T: class
{
  //all the code
}

Возможно, вы ищите дроида.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...