私のような一般的なASP.NETコアWEBAPIコントローラがあります。ProducesResponseTypeをジェネリック型引数で使用するための属性でtypeパラメータを使用する場合の回避策はありますか?
public abstract class EntityController<TEntity>
{
public IActionResult Get(string id)
{
var entity = ... //load from database by id
if (entity != null)
return new JsonResult(value, this.SerializerSettings()) {StatusCode 200};
return NotFound();
}
}
を、私はGet()
法上の次の属性適用したい:今のところ
[ProducesResponseType(typeof(TEntity), 200)] //this causes compilation error.
[ProducesResponseType(typeof(Object), 404)]
を、周りの唯一の仕事は、上書きすることです派生したコントローラの各メソッドを追加し、そこに属性を追加してください:
public class DerivedController :EntityController<MyEntity>
{
[ProducesResponseType(typeof(TEntity), (int) HttpStatusCode.OK)]
[ProducesResponseType(typeof(Object), (int) HttpStatusCode.NotFound)]
public IActionResult Get(string id)
{
return base.Get(id);
}
}
私はオーバーライドする必要が非常に不便ですすべてのコントローラ内のすべてのRESTメソッドを使用して、コンクリートのTEntity
コンクリートを使用します。 ?:-(
任意のより良い回避策
私が考えることができる唯一の理由は、ジェネリック型のパラメータが実行時に解決されるということです。しかし、属性パラメータはコンパイル時に解決されなければなりません。したがって、属性の引数としてジェネリック型のパラメータを使用することはできません。あなたは見た目[ここ](https://msdn.microsoft.com/en-us/library/t9h2ax10.aspx)と[ここ](http://stackoverflow.com/questions/294216/why-does- c-sharp-forbid-generic-attribute-types)を参照してください。回避策のために、できるならば何かを押してみようと思います。 –