实现从另一个基类派生的泛型BaseClass <t>

时间:2018-12-05 14:57:50

标签: c# generics

考虑到,TableController是存在于nuget包库(Microsoft.Azure.Mobile.Server.Tables)中的类之一。为了创建自己的Controller,我们需要继承该类并编写诸如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
}

我需要编写其他控制器,其中Get,Update,Delete的方法通用。我考虑过使用通用基类,它可能如下所示:想法是将通用代码重用到基类中

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
}

但是它会产生预期的编译错误。在这种情况下是否有实现通用基类的方法?

已编辑: 添加错误画面 enter image description here

1 个答案:

答案 0 :(得分:2)

这应该很简单:

LineStringField

您将实现为:

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
}

请注意,如果public class OrderController : BaseController<Order> { } 约束TableController,则必须对T施加适当的约束


编辑:我认为这对您没有用。但是代码会编译。