【发布时间】:2015-06-06 12:57:17
【问题描述】:
我有一些像 CustomerModel 或 CustomerDetailsModel 这样的类继承自 ModelBase。
我也不想为每个模型类型引入子类。
在一种情况下,foreach 有一个 post 方法。
所以我可以手动创建多个路由来调用一个看起来像这样的方法
Handle<T>(T model) where T : ModelBase
它们仅在被调用的路径上有所不同。例如:
baseurl/api/customer => CustomerModel
baseurl/api/customerdetails => CustomerDetailsModel
我想实现一个通用的 web api 方法,比如
[HttpPost]
void Post<T>(T model) where T : ModelBase
如果我只是创建一个泛型方法,我会得到一个异常,它告诉我 web api 方法不能有泛型方法。但是前段时间我看到了一个使用 web api v1 的实现,它使用某种自定义查找机制来处理这个问题。但是我想不通了。
作为一种解决方法,我创建了一个调用包装器,它确定类型并调用内部泛型方法,但这感觉很丑
public async Task<IHttpActionResult> Post(string id, string moduleType)
{
await AsyncGenericCallWrapper(moduleType);
...
如果有上面提到的通用控制器,那就太好了。
private async Task AsyncGenericCallWrapper(string moduleType)
{
Type type = GetModuleType(moduleType);
var content = await Request.Content.ReadAsStringAsync();
var instance = JsonConvert.DeserializeObject(content, type);
MethodInfo method = this.GetType().GetMethod("InternalGenericMethod", BindingFlags.NonPublic | BindingFlags.Instance);
MethodInfo generic = method.MakeGenericMethod(type);
var result = generic.Invoke(this, new object[] { instance }) as Task;
await result;
}
我可以图像有一个自定义属性来映射类型,如
[GenericRoute("/customer", typeof(CustomerModel)]
[GenericRoute("/customerDetail", typeof(CustomerDetailModel)]
void Post<T>(T model) where T : ModelBase
有了这个我可以为每个属性创建路由,但现在仍然调用该方法,因为它是通用的,我也不知道如何干扰反序列化机制
谁能告诉我如何实现那个 GenericWebAPiMethod?
【问题讨论】:
标签: c# generics asp.net-web-api asp.net-web-api2 asp.net-web-api-routing