我正在创建一个自定义 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/