2015-04-17 39 views
0

我有点困惑,我的面向对象/模型绑定知识不是它应该的。我创建了一个存储库,可以基于泛型类型返回一个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次服务器响应,我做了什么。

在此先感谢您

+1

这是否正常工作,如果您刚刚通过浏览器中的网址?我不认为这是一个角度问题 - 你的路线如何支持通用控制器?以下是其他人所做的工作,也可能适合您:http://stackoverflow.com/questions/23023793/generic-web-api-controller。 – sirrocco

+0

默认路由。您发布的备选方案类似于提供3个独立的控制器方法,但在控制器级别。我试图找到一个控制器,一个Web方法。可能是一个步骤太... – sarin

+1

是的,这可能不会工作..除非我的网络API API知识有点过时。该路线无法知道用于控制器的类型。使用我在上面给出的链接中的内容,然后你的生活会简单得多 – sirrocco

回答

1

您可以通过一些使用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}) 
}