Hello, how to make a routing with a parameter of type T (class)?

public class DocumentController : DbAccessController { [RoutePrefix("T/values")] //Where T - document name/tableEntityClass [HttpGet] public IHttpActionResult GetItem(Guid id) { return this.Ok(this._documentQueries.GetItem<T>(id)); } } 

    1 answer 1

    You can create a separate controller for each valid parameter:

     class DocumentControllerBase<T> : DbAccessController { [Route("values")] [HttpGet] public IHttpActionResult GetItem(Guid id) { return this.Ok(this._documentQueries.GetItem<T>(id)); } } [RoutePrefix("Foo")] class FooDocumentController : DocumentControllerBase<Foo> {} 

    Or you can take the name of a type in a string and turn it into a concrete implementation of generalized methods through a dictionary and an intermediate layer of abstraction:

     interface IDocumentType { object GetItem(IDocumentQueries q, Guid id); } class DocumentType<T> : IDocumentType { public object GetItem(IDocumentQueries q, Guid id) { return q.GetItem<T>(id); } } class DocumentController : DbAccessController { private static Dictionary<string, IDocumentType> types = new Dictionary<string, IDocumentType>() { { "Foo", new DocumentType<Foo>() }, }; [Route("{T}/values")] public IHttpActionResult GetItem(string T, Guid id) { return this.Ok(types[T].GetItem(this._documentQueries, id)); } } 

    Well, no one canceled the usual switch.