如何在子类中使用多种类型的泛型

时间:2018-06-18 12:36:11

标签: c# asp.net generics inheritance generic-programming

我有一个BaseController

public abstract class BaseController<T> : ApiController 
{

    protected APIResponseTO<T> _reponse;

    protected IHttpActionResult CreateResponse(HttpStatusCode httpStatus, T data)
    {
        _reponse = new APIResponseTO<T>()
        {
            HttpStatus = httpStatus,
            Data = data
        };
        return Ok(_reponse);
    }
}

现在我希望任何继承此类的类都可以为T定义多个类型

 public class CustomerController : BaseController<T>
 {

    public IHttpActionResult Get()
    {

        var customers = _customerService.GetCustomers();
        //call Parent Class CreateResponse() to create IHttpActionResult object
        //here customers is IEnumerable<Customer>
        return CreateResponse(HttpStatusCode.Created, customers)
    }

    public IHttpActionResult Post([FromBody]Customer customer)
    {
        var custId= _customerService.AddCustomers();
        //call Parent Class CreateResponse() to create IHttpActionResult object
        //here customer is integer(Single Object)
        return CreateResponse(HttpStatusCode.Created, custId)
    }
}

我的要求是我可以在课堂上以某种方式定义

public class CustomerController : BaseController<T> where T : Customer, IEnumerable<Customer>, int
 {
 }

或在方法级别

 public IHttpActionResult Post<T>([FromBody]Customer customer)
  where T : int
    {
        var custId= _customerService.AddCustomers();
        //call Parent Class CreateResponse() to create IHttpActionResult object
        //here customer is integer(Single Object)
        return CreateResponse(HttpStatusCode.Created, custId)
    }

感谢。

2 个答案:

答案 0 :(得分:2)

我不完全确定我完全理解你需要什么,但我想我有一个想法 我认为你不应该使用泛型类,而是使用泛型方法:

public class CustomerController : BaseController
{

    public IHttpActionResult Get()
    {

        var customers = new List<object>();
        return CreateResponse<List<object>>(HttpStatusCode.Created, customers);
    }

    public IHttpActionResult Post([FromBody]Customer customer)
    {
        int custId = 17;
        return CreateResponse<int>(HttpStatusCode.Created, custId);
    }
}

public abstract class BaseController : ApiController
{

    protected IHttpActionResult CreateResponse<TData>(HttpStatusCode httpStatus, TData data)
    {
        // Problem here is that BaseController is not a generic class anymore, so you can't store your responses but then again, why would you want to store them in a variable?
        var reponse = new APIResponseTO<TData>()
        {
            HttpStatus = httpStatus,
            Data = data
        };

        return Ok(reponse);
    }
}

希望这有帮助。

答案 1 :(得分:0)

像这样写你的课(在课后加上<T>

public class CustomerController<T> : BaseController<T> where T : Customer, IEnumerable<Customer>, int {
}

将通用设置在更高级别