c# - 继承 .NET 的通用 Controller 类

标签 c# generics inheritance asp.net-web-api

我正在创建一个自定义 Controller 类,我的所有其他 Controller 类都将继承自 .Net Framework 4.8、Web API

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

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

这会产生编译时错误

Error CS0450 'ApiController': cannot specify both a constraint class and the 'class' or 'struct' constraint

我知道我缺少正确语法的小细节。
T 是一项服务,它对于每个 Controller 都是独立的,我想确保它始终是一个引用类型。我还想继承主 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();
    }
}

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

最佳答案

如果我理解你的问题,问题是你申请了 ApiControler作为对 T 的约束。当您想将其作为 BaseApiController<T> 的祖先应用时.

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

根据Syntax examples ,先继承,再约束。所以:

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

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

关于c# - 继承 .NET 的通用 Controller 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58764250/

相关文章:

javascript:查找属性所属的原型(prototype)对象

c# - HiddenFor 助手的问题

c# - 使用 pocos 以声明方式定义 xml 序列化

Java:使用非默认构造函数实例化通用对象

swift - 使用带有协议(protocol)和关联类型的通用类型?

C# 从泛型方法调用泛型方法

c++ - 从基类构造函数构造派生类对象

python - 为什么 PyTorch 自定义模块中需要 super 构造函数?

c# - 理解和解决 K-Way 归并排序

c# - JSON.net CF 3.5,验证JSON是否完整