使用具有两种类型但具有不同名称的API.我如何重用我的代码?

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)

Cod*_*ter 6

我假设SearchKMQueryResponseTopSolutionsKMQueryResponse生成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)