C# 合并结构相似的方法以避免重复

C# 合并结构相似的方法以避免重复,c#,.net,visual-studio-2017,C#,.net,Visual Studio 2017,如何以更实用的方式组合/合并/缩短这些方法以避免重复? public Task<List<UsageSummaryModel>> GetBilledUsageSummary(int accountId, string billingRunId) { var url = string.Format("{0}{1}/{2}/usage", BaseUrl, accountId, billingRunId); re

如何以更实用的方式组合/合并/缩短这些方法以避免重复?

public Task<List<UsageSummaryModel>> GetBilledUsageSummary(int accountId, string billingRunId)
        {
            var url = string.Format("{0}{1}/{2}/usage", BaseUrl, accountId, billingRunId);
            return GetAsyncHandlerForRestApi<List<UsageSummaryModel>>(url);
        }

        public Task<GetSampleInvoiceRunIdResponse> GetUnBilledUsageSampleRunId(int accountId)
        {
            var url = string.Format("{0}{1}/sample?usageonly=true", BaseUrl, accountId);
            return GetAsyncHandlerForRestApi<GetSampleInvoiceRunIdResponse>(url);
        }

        public Task<List<UsageSummaryModel>> GetUnBilledUsageSummary(int accountId, int sampleRunId)
        {
            var url = string.Format("{0}{1}/sample/{2}/usage", BaseUrl, accountId, sampleRunId);
            return GetAsyncHandlerForRestApi<List<UsageSummaryModel>>(url);
        }


        public Task<List<CallDetailsRecordModel>> GetBilledCallDetailRecords(int accountId, int billingRunId, int cdrSummaryId, int page, int pageSize)
        {
            var url = string.Empty;

            if (page == -1 && pageSize == -1)//load all records
            {
                url = string.Format("{0}{1}/{2}/usage/{3}", BaseUrl, accountId, billingRunId, cdrSummaryId);
            }
            else
            {
                url = string.Format("{0}{1}/{2}/usage/{3}?page={4}&pageSize={5}", BaseUrl, accountId, billingRunId, cdrSummaryId, page, pageSize);
            }

            return GetAsyncHandlerForRestApi<List<CallDetailsRecordModel>>(url);
        }

        public Task<List<CallDetailsRecordModel>> GetUnBilledCallDetailRecords(int accountId, int sampleRunId, int cdrSummaryId, int page, int pageSize)
        {
            var url = string.Empty;

            if (page == -1 && pageSize == -1)//load all records
            {
                url = string.Format("{0}/{1}/SAMPLE/{2}/usage/{3}", BaseUrl, accountId, sampleRunId, cdrSummaryId);
            }
            else
            {
                url = string.Format("{0}/{1}/SAMPLE/{2}/usage/{3}?page={4}&pageSize={5}", BaseUrl, accountId, sampleRunId, cdrSummaryId, page, pageSize);
            }

            return GetAsyncHandlerForRestApi<List<CallDetailsRecordModel>>(url);
        }
公共任务GetBilledSageSummary(int accountId,string billingRunId)
{
var url=string.Format(“{0}{1}/{2}/usage”,BaseUrl,accountId,billingRunId);
返回GetAsyncHandlerForRestApi(url);
}
公共任务GetUnbiledUsageSamplerUnid(int accountId)
{
var url=string.Format(“{0}{1}/sample?usageonly=true”,BaseUrl,accountId);
返回GetAsyncHandlerForRestApi(url);
}
公共任务GetUnbilledSageSummary(int accountId,int sampleRunId)
{
var url=string.Format(“{0}{1}/sample/{2}/usage”,BaseUrl,accountId,sampleunid);
返回GetAsyncHandlerForRestApi(url);
}
公共任务GetBilledCallDetailRecords(int accountId、int billingRunId、int CDRSumaryId、int page、int pageSize)
{
var url=string.Empty;
if(page=-1&&pageSize=-1)//加载所有记录
{
url=string.Format(“{0}{1}/{2}/usage/{3}”),BaseUrl、accountId、billingRunId、cdrsumaryId);
}
其他的
{
url=string.Format(“{0}{1}/{2}/usage/{3}?page={4}&pageSize={5}”,BaseUrl,accountId,billingRunId,cdrsumaryid,page,pageSize);
}
返回GetAsyncHandlerForRestApi(url);
}
公共任务GetUnbiledCallDetailRecords(int accountId、int sampleRunId、int cdrSummaryId、int page、int pageSize)
{
var url=string.Empty;
if(page=-1&&pageSize=-1)//加载所有记录
{
url=string.Format(“{0}/{1}/SAMPLE/{2}/usage/{3}”,BaseUrl,accountId,sampleunid,cdrsumaryid);
}
其他的
{
url=string.Format(“{0}/{1}/SAMPLE/{2}/usage/{3}?page={4}&pageSize={5}”,BaseUrl,accountId,sampleruid,cdrsumaryid,page,pageSize);
}
返回GetAsyncHandlerForRestApi(url);
}

您可以创建并重载将泛型类型、url格式和对象参数数组作为参数的方法:

public static Task<T> GetAsyncHandler(string urlFormat, params object[] args)
{
    string url = string.Format(urlFormat, args);
    return Task<T>.Run( () => { return GetAsyncHandlerForRestApi(url)});
}

您可以设计EndPointBuilder,但您希望构建服务调用所需的URL。

是否有理由使用
int-billingRunId
vs
string-billingRunId
?是的,但为了简单起见,让我们保留其中一种或另一种数据类型。我投票结束这个问题,因为它属于代码复查,非常酷!非常感谢你。用高阶函数/闭包创建这个函数有什么意义吗?如果你愿意,当然可以这样做。例如,您可以将a函数传递给GetAsyncHandler,并让它为您构建URL。
public class AsyncHandler<T>
{
    private string url;

    public AsyncHandler(string url)
    {
        this.url = url;
    }
    public static AsyncHandler<T> GetAsyncHandlerForRestApi(string url)
    {
        return new AsyncHandler<T>(url);
    }
    public static Task<T> GetAsyncHandler(string urlFormat, params object[] args)
    {
        string url = string.Format(urlFormat, args);
        return Task<T>.Run( () => { return GetAsyncHandlerForRestApi(url)});
    }
}
 string endPointFormat = BaseUrl + "{0}{1}/sample?usageonly=true";
 Task<List<UsageSummaryModel>> result = AsyncHandler<List<UsageSummaryModel>>.GetAsyncHandler(endPointFormat, accountId);
public Task<List<UsageSummaryModel>> GetBilledUsageSummary(int accountId, string billingRunId)
    {
        string endPointFormat= BaseUrl + "{0}{1}/{2}/usage";
        return AsyncHandler<List<UsageSummaryModel>>.GetAsyncHandler(endPointFormat, accountId, billingRunId);
    }

    public Task<List<UsageSummaryModel>> GetUnBilledUsageSampleRunId(int accountId)
    {
        string endPointFormat = BaseUrl + "{0}{1}/sample?usageonly=true";
        return AsyncHandler<List<UsageSummaryModel>>.GetAsyncHandler(endPointFormat, accountId);
    }
public static Task<T> GetAsyncHandler(EndPointBuilder builder)
{
    string url = BuildUrl.BuildUrl();
    return Task<T>.Run( () => { return GetAsyncHandlerForRestApi(url)});
}