web api 2 controller get方法请求\从Angular返回泛型类型?

时间:2015-04-17 12:16:40

标签: angularjs asp.net-web-api2

我有点困惑,我的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,无论我做什么。

提前谢谢

1 个答案:

答案 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})
}