我有一个通用的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为泛型类型?
谢谢! 碧玉
答案 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);
}
}