WebApi2泛型类型的ResponseType属性

时间:2016-10-06 08:48:05

标签: generics asp.net-web-api attributes

我有一个通用的WebApi控制器,其CRUD操作如下:

public abstract class BaseController<TEntity> : ApiController where TEntity : class
{
    protected abstract DbSet<TEntity> DatabaseSet { get; }

    // GET: api/{entity}
    [Route("")]
    public IEnumerable<TEntity> GetAll()
    {
        return DatabaseSet;
    }

    // GET: api/{entity}/5
    [Route("{id:int}")]
    //[ResponseType(TEntity)] ToDo: is this possible? <---
    public IHttpActionResult Get(int id)
    {
        TEntity entity = DatabaseSet.Find(id);
        if (entity == null)
        {
            return NotFound();
        }

        return Ok(entity);
    }

    // ...
    // and the rest
    // ...
}

我的问题是关于注释掉的[ResponseType(TEntity)]。这条线不起作用。也不是typeof(TEntity)。错误是&#39;属性参数不能使用类型参数&#39;有没有办法让ResponseType为泛型类型?

谢谢! 碧玉

1 个答案:

答案 0 :(得分:3)

从此link开始,C#中无法使用通用属性。

我在ResponseType属性中为Generic参数做了以下解决方法,这基本上是将属性添加到派生类方法。

public abstract class BaseApiController<TModel, TEntity> : ApiController
                                                           where TModel : class, IModel
                                                           where TEntity : IApiEntity
{
    protected readonly IUnitOfWork _uow;
    protected readonly IRepository<TModel> _modelRepository;

    public BaseApiController(IUnitOfWork uow)
    {
        if (uow == null)
            throw new ArgumentNullException(nameof(uow));
        _uow = uow;

        _modelRepository = _uow.Repository<TModel>();
    }

    protected virtual IHttpActionResult Get(int id)
    {
        var model = _modelRepository.Get(m => m.Id == id);
        if (model == null)
        {
            return NotFound();
        }
        var modelEntity = Mapper.Map<TEntity>(model);
        return Ok(modelEntity);
    }
}

public class PostsController : BaseApiController<Post, PostApiEntity>
{
    public PostsController(IUnitOfWork uow) : base(uow)
    {

    }

    [ResponseType(typeof(PostApiEntity))]
    public IHttpActionResult GetPost(int id)
    {
        return Get(id);
    }
}