C# 实现通用基类<;T>;它派生自另一个基类

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

请考虑,TableController是nuget包库(Microsoft.Azure.Mobile.Server.Tables)中的一个类。为了创建自己的控制器,我们需要继承类并编写GetAll、GetSingle等方法

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我编辑了这个问题。我没有投反对票。:-)谢谢你宝贵的回答。请看一下我编辑的问题,如果你能得到我的问题,请告诉我