我有点困惑,我的OO /模型绑定知识不是它应该是什么。我创建了一个存储库,可以根据泛型Type返回Typed对象的List。
public RawDataAggregatedItems<Project> Get(int? id)
{
return _uiDataClass.GetRawDataAggregated<Project>(id);
}
return _uiDataClass.GetRawDataAggregated<AssetType>(periodId);
return _uiDataClass.GetRawDataAggregated<Category>(periodId);
....
而不是在我的WebApi控制器中有3个单独的Get方法,指的是每个Type我认为我会重构并传入一个通用的Type T.
return _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);
}
我如何从Angular中调用它并告诉它我想要哪种类型?一个复杂的因素可能是RawDataAggregatedItem的所有派生类型都具有相同的属性集,只是不同的值。
return $http({ method: "GET", url: "/api/RawDataAggregated/Project/" + periodId });
return $http({
method: "POST", url: "/api/RawDataAggregated/",
data:
{
AggregateType: aggregateBy,
PeriodId: periodId
}
});
我得到的服务器响应为500,无论我做什么。
提前谢谢
答案 0 :(得分:1)
你可以通过一些玩反射来实现这一点。您已经将实际数据类型传递给服务器,现在您必须找到实际类型并调用指定实际类型的方法。它可能如下所示:
[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})
}