Tom*_*les 1 .net c# generics types .net-3.5
我正在使用一个Web服务,它返回两种类型完全相同但被称为两种不同的东西(是的,我知道的API很棒......).一种叫做SearchKMQueryResponse,另一种叫做TopSolutionsKMQueryResponse.我将这些类型的输出映射到我自己的模型类中,并且必须使用两个采用不同参数类型的方法,但返回相同的类型.这两种API类型继承了该object类型,因此我无法将基类型作为参数传递.它们不通过API公开接口,所以我也搞砸了.
那么有一个优雅的解决方案,以停止重复自己在下面的代码?...
编辑:我正在使用.Net v3.5来解决这个问题.
public static KmSearchResponse Map(SearchKMQueryResponse response)
{
if (response == null)
{
return null;
}
else
{
var myResponse = new KmSearchResponse()
{
CountTotal = long.Parse(response.model.instance.resultlist.resultlist[0].Value),
Message = response.message,
Status = (MyProject.Model.StatusType)response.status,
};
for (var startID = 2; startID < (myResponse.CountTotal * 5); startID += 5)
{
myResponse.Results.Add(
KmSearchResponseResultsMapper.Map(
response.model.instance.resultlist.resultlist, startID)
);
}
myResponse.Count = myResponse.Results.Count;
return myResponse;
}
}
public static KmSearchResponse Map(TopSolutionsKMQueryResponse response)
{
if (response == null)
{
return null;
}
else
{
var myResponse = new KmSearchResponse()
{
CountTotal = long.Parse(response.model.instance.resultlist.resultlist[0].Value),
Message = response.message,
Status = (MyProject.Model.StatusType)response.status,
};
for (var startID = 2; startID < (myResponse.CountTotal * 5); startID += 5)
{
myResponse.Results.Add(
KmSearchResponseResultsMapper.Map(
response.model.instance.resultlist.resultlist, startID)
);
}
myResponse.Count = myResponse.Results.Count;
return myResponse;
}
}
Run Code Online (Sandbox Code Playgroud)
我假设SearchKMQueryResponse并TopSolutionsKMQueryResponse生成WCF数据合同.这些是作为部分类生成的,因此您可以为应用接口的地方编写另一部分:
IQueryResponse
{
SomeModel model { get; set; }
SomeMessage message { get; set; }
SomeStatus status { get; set; }
}
public partial class SearchKMQueryResponse : IQueryResponse { }
public partial class TopSolutionsKMQueryResponse : IQueryResponse { }
Run Code Online (Sandbox Code Playgroud)
现在您可以更改映射器以接受接口作为输入:
KmSearchResponse Map(IQueryResponse response)
Run Code Online (Sandbox Code Playgroud)