繁体   English   中英

通用 controller class 与 inheritance .NET

[英]Generic controller class with inheritance .NET

I am making a custom controller class, from which all my other controller classes will inherit in.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”:不能同时指定约束 class 和“类”或“结构”约束

我知道我缺少正确语法的小细节。
T是一项服务,对于每个 controller 都是单独的,我想确保它始终是一个引用类型。 我还想从主ApiController class 继承。

如果我这样做,就没有错误(这对我有用):

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

我只想知道如何在BaseApiController class 中添加T检查引用类型。

如果我正确理解您的问题,那么问题是您将ApiControler作为约束应用到 T。当您想将其应用为BaseApiController<T>的祖先时。

作为约束ApiControler它无效,因为您已经应用了class约束。 class包括所有类,包括 ApiControler 和所有其他尚未编写的 class。 这是 ApiControler 限制较少的约束。 您只使用特定类型或接口作为约束,如果您希望所有可能的 T 绝对肯定具有该继承/接口实现。

根据语法示例,您首先继承,然后是约束。 所以:

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

可能是您正在寻找的机器人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM