如何将类转换为泛型

时间:2019-09-09 07:15:05

标签: c# templates generics asp.net-web-api types

我有一个方法来调用api服务以获得一些结果,并且方法的返回类型是类类型。对于单个类,我可以将name指定为其返回类型并可以正常工作。但是在某些情况下,返回类型将被更改。在那种情况下,我陷入了继续代码的困境。请指导我如何实现这一目标。

预期解决方案: 我希望在Details类的GetDoc(..)方法中添加if条件。基于docType,我需要将GetRequest(Records)更改为GetRequest(Employee)。

public Class Details{
public async Task<IActionResult> GetDoc(string docType){

var result= await _apiService.GetRequest<Records>(  //in some cases i need to change 'Records' to 'Employee'
url,//api url
...
)

}
}
----------
public class Record{
public Record(int id, string name){
ID=id;
Name=name
}
public int ID{get; set;}
public string Name{get;set;
}

public class Employee{
public Record(int id, string name){
ID=id;
Name=name
}
public int ID{get; set;}
public string Name{get;set;
}

public class ApiService{

public async Task<IactionResult> GetRequest<T>(string url, ....){
// here i am deserializing the response content using jsonconvert.
}

}


1 个答案:

答案 0 :(得分:1)

我建议不要为每个方法创建不同的终结点(建议这样做,因为它看起来像是为各个实体获取详细信息的终结点),因此建议您不要这样做。因此,类似:

public class RecordController
{
    public async Task<IActionResult> GetDetails(int id)
    {
        var result = await _apiService.GetRequest<Record>(id);
        // Rest of the processing...
    }
}

然后是另一个员工控制者:

public class EmployeeController
{
    public async Task<IActionResult> GetDetails(int id)
    {
        var result = await _apiService.GetRequest<Employee>(id);
        // Rest of the processing...
    }
}

如果其余逻辑允许,则可以进一步创建通用控制器,例如:

public abstract class MyBaseController<T>
{
    public virtual async Task<IActionResult> GetDetails(int id)
    {
        var result = await _apiService.GetRequest<T>(id);
        // Rest of the processing...
        // If the processing is not generic you may be able to use a delegate to handle that bit.
    }
}

现在在您的单个控制器中,您可以像这样继承:

public class RecordController : MyBaseController<Record>
{
}

public class EmployeeController : MyBaseController<Employee>
{
}

实际上没有对此进行测试。只需草绘代码即可为您提供设计类的想法。