C# 实现通用基类<;T>;它派生自另一个基类
请考虑,TableController是nuget包库(Microsoft.Azure.Mobile.Server.Tables)中的一个类。为了创建自己的控制器,我们需要继承类并编写GetAll、GetSingle等方法C# 实现通用基类<;T>;它派生自另一个基类,c#,generics,C#,Generics,请考虑,TableController是nuget包库(Microsoft.Azure.Mobile.Server.Tables)中的一个类。为了创建自己的控制器,我们需要继承类并编写GetAll、GetSingle等方法 public class OrderController : TableController<Order> { public IQueryable<Order> GetAll() { return
public class OrderController : TableController<Order>
{
public IQueryable<Order> GetAll()
{
return Query();
}
public SingleResult<Order> GetSingle(string id)
{
return Lookup(id);
}
public Task Delete(string id)
{
return DeleteAsync(id);
}
//More methods here
}
公共类OrderController:TableController
{
公共IQueryable GetAll()
{
返回查询();
}
公共SingleResult GetSingle(字符串id)
{
返回查找(id);
}
公共任务删除(字符串id)
{
返回deletesync(id);
}
//这里有更多的方法
}
我需要编写其他的控制器,其中的方法是常见的获取,更新,删除。我考虑过使用泛型基类,它可以像下面这样:想法是将公共代码重新使用到基类中
public class OrderController : BaseController<User>
{
}
public class BaseController<T> : TableController<T> where T: class
{
//All common methods like GetAll, GetSingle can be here with Type T
public IQueryable<T> GetAll()
{
return Query();
}
public SingleResult<T> GetSingle(string id)
{
return Lookup(id);
}
public Task Delete(string id)
{
return DeleteAsync(id);
}
//More methods here
}
公共类OrderController:BaseController
{
}
公共类BaseController:TableController,其中T:class
{
//所有常见的方法,如GetAll、GetSingle,都可以在这里使用类型T
公共IQueryable GetAll()
{
返回查询();
}
公共SingleResult GetSingle(字符串id)
{
返回查找(id);
}
公共任务删除(字符串id)
{
返回deletesync(id);
}
//这里有更多的方法
}
但它会像预期的那样给出编译错误。在这种情况下,有没有办法实现泛型基类
编辑:
添加错误屏幕
这应该简单到:
public abstract class BaseController<T> : TableController<T>
{
protected override void Initialize(HttpControllerContext controllerContext)
{
base.Initialize(controllerContext);
//Some code here...
}
// GET T/TodoItem
public IQueryable<T> GetAllTodoItems()
{
// your code here. T will be the right type but it'll be near on useless
}
//More methods here
}
公共抽象类BaseController:TableController
{
受保护的覆盖无效初始化(HttpControllerContext controllerContext)
{
初始化(controllerContext);
//这里有一些代码。。。
}
//获取T/TodoItem
公共IQueryable GetAllTodoItems()
{
//这里的代码.T将是正确的类型,但几乎没有用处
}
//这里有更多的方法
}
您可以将其实现为:
public class OrderController : BaseController<Order>
{
}
公共类OrderController:BaseController
{
}
请注意,如果TableController
约束T
,则必须对BaseController
编辑:我不相信这对你有用。但是代码会编译。
我试过了,但没有成功。
-你能详细说明一下吗?你的代码不会编译。这是无效的:BaseController@rory.ap:我想这就是OP制造基本语法错误的关键所在?@rory.ap:是的,但要求对此进行修复pattern@Stefan如果需要,但没有说明为什么Order
不能成为结构取决于TableController
上的约束,谢谢。但是OrderController中的所有代码都是通用的。我不想推翻它。。只需要简单的派生类如果你不想改变行为,那么拥有一个基类是没有意义的。你只有一节课。但是谢谢你的否决票。您的GetAllTodoItems
需要知道返回什么类型的对象,因此必须重写something@Jamiec我编辑了这个问题。我没有投反对票。:-)谢谢你宝贵的回答。请看一下我编辑的问题,如果你能得到我的问题,请告诉我