webapi 2控制器get方法请求从Angular返回一个泛型类型?
问题描述:
我有点困惑,我的面向对象/模型绑定知识不是它应该的。我创建了一个存储库,可以基于泛型类型返回一个Typed对象列表。webapi 2控制器get方法请求从Angular返回一个泛型类型?
public RawDataAggregatedItems<Project> Get(int? id)
{
return _uiDataClass.GetRawDataAggregated<Project>(id);
}
return _uiDataClass.GetRawDataAggregated<AssetType>(periodId);
return _uiDataClass.GetRawDataAggregated<Category>(periodId);
....
不是有3种独立的Get方法在我的WebAPI控制器参照各类型我想我会重构,并通过泛型类型T.
回报_uiDataClass.GetRawDataAggregated(periodId);
[HttpGet]
public RawDataAggregatedItems<T> Get<T>(int? periodId)
where T : RawDataAggregatedItem, new()
{
return _uiDataClass.GetRawDataAggregated<T>(periodId);
}
or
[HttpPost]
public RawDataAggregatedItems<T> Get<T>(RawDataAggregateViewModel viewModel)
where T : RawDataAggregatedItem, new()
{
return _uiDataClass.GetRawDataAggregated<T>(viewModel.PeriodId);
}
我如何把这种从角,并告诉它我想要的类型?一个复杂的因素可能是所有派生类型的RawDataAggregatedItem都具有相同的一组属性,只是不同的值。
return $http({ method: "GET", url: "/api/RawDataAggregated/Project/" + periodId });
return $http({
method: "POST", url: "/api/RawDataAggregated/",
data:
{
AggregateType: aggregateBy,
PeriodId: periodId
}
});
我得到了500次服务器响应,我做了什么。
在此先感谢您
答
您可以通过一些使用Reflection进行存档。您已经将实际数据类型传递给服务器,现在您必须找到实际的类型并调用指定实际类型的方法。它可能看起来像下面这样:
[HttpPost]
public RawDataAggregatedItems<T> Get<T>(RawDataAggregateViewModel viewModel)
{
//Finding required type
var actualType=Assembly.GetExecutingAssembly().GetTypes().Where(x => x.Name == viewModel.AggregateType).FirstOrDefault();
//Constructing generic method
MethodInfo theMethod = entity.GetType().GetMethod("GetRawDataAggregated");
MethodInfo generic = theMethod.MakeGenericMethod(actualType);
return generic.Invoke(_uiDataClass, new object[] { viewModel.periodId})
}
这是否正常工作,如果您刚刚通过浏览器中的网址?我不认为这是一个角度问题 - 你的路线如何支持通用控制器?以下是其他人所做的工作,也可能适合您:http://*.com/questions/23023793/generic-web-api-controller。 – sirrocco
默认路由。您发布的备选方案类似于提供3个独立的控制器方法,但在控制器级别。我试图找到一个控制器,一个Web方法。可能是一个步骤太... – sarin
是的,这可能不会工作..除非我的网络API API知识有点过时。该路线无法知道用于控制器的类型。使用我在上面给出的链接中的内容,然后你的生活会简单得多 – sirrocco