【发布时间】:2020-07-26 15:54:10
【问题描述】:
我正在尝试创建一个 HTTP GET 方法,该方法返回一个通用列表 (IENumerable<T>),然后我的 Angular 应用程序可以使用 http.get 读取这些项目。
在处理来自 Angular 应用程序调用的 MVC 项目的控制器类中,我有以下方法:
[HttpGet(URLs.CustomField.GetCustomFieldsForMatterAsync)]
[ProducesResponseType(typeof(IEnumerable<CustomFieldGroup>), 200)]
public async Task<IEnumerable<CustomFieldDTO>> GetCustomFieldsByFileIDAsync(int fileID)
{
// fetches the list from DB, stores in a variable called customFields
List<CustomFieldDTO> list = new List<CustomFieldDTO>();
foreach (CustomField customField in customFields)
{
switch (customField.CustomFieldType)
{
case CustomFieldType.Text:
case CustomFieldType.DateTime: list.Add(_mapper.Map<CustomFieldDTO<string>>(customField)); break;
case CustomFieldType.Boolean: list.Add(_mapper.Map<CustomFieldDTO<bool>>(customField)); break;
case CustomFieldType.Currency: list.Add(_mapper.Map<CustomFieldDTO<decimal>>(customField)); break;
case CustomFieldType.List:
case CustomFieldType.Number: list.Add(_mapper.Map<CustomFieldDTO<int>>(customField)); break;
}
}
return list;
}
我需要返回一个 customFields 的通用列表,以便 Angular 项目可以根据其类型正确处理该属性。
我不知何故需要将返回类型从IEnumerable<CustomField> 更改为IEnumerable<CustomField<T>>。值的类型可以是:string、bool、int、dateTime。
我最接近的方法是创建一个只包含值的 CustomField 抽象类。
public class CustomFieldDTO<T> : CustomFieldDTO
{
public T Value { get; set; }
}
public abstract class CustomFieldDTO { // bunch of other variables }
通过这样做,我至少可以创建如上所示的 GetCustomFieldsByFileIDAsync 方法。
但是角度应用程序只是没有在 Value 属性中显示任何值。如何将通用类型的项目传递给 Angular?我不能说:[ProducesResponseType(typeof(IEnumerable<CustomField<T>>), 200)],因为那行不通。
还尝试将方法更改为:public async Task<IEnumerable<CustomFieldDTO<T>>> GetCustomFieldsByFileIDAsync<T>(int fileID) 但 angular 说找不到它????
在角度,我正在这样做:
this.http.get<CustomField<any>>(URLs.GetCustomFieldsForMatter(fileID)).subscribe(customFields =>
{
console.log(customFields);
});
有什么办法可以实现吗?
【问题讨论】:
-
尝试用
List<object>替换CustomFieldDTO<T> -
嘿,这确实有效!不知道为什么在那段时间之后我从来没有想过这个。我知道它并不理想(对象是全部),但它是一个答案(如果你想让它成为一个答案)。
标签: c# angular asp.net-mvc typescript asp.net-core