通过使用泛型避免c#-中的代码重复?

通过使用泛型避免c#-中的代码重复?,c#,.net,generics,C#,.net,Generics,我在控制器代码中有以下代码: public async Task<int> PullClientsAsync() { var service = new DesktopConnectorService<ClientModel>( new WapiRepository<ClientModel>(), new QuickBooksRepository<ClientModel>()); var filter = n

我在控制器代码中有以下代码:

public async Task<int> PullClientsAsync()
{
    var service = new DesktopConnectorService<ClientModel>(
            new WapiRepository<ClientModel>(), new QuickBooksRepository<ClientModel>());
    var filter = new ClientSearchFilter();
    try
    {
        var items = await service.GetItemsAsync(filter);
        return items.Count;
    }
    catch (Exception ex)
    {


    }
    return 0;
}

public async Task<int> PullInvoicesAsync()
{
    var service = new DesktopConnectorService<InvoiceModel>(
        new WapiRepository<InvoiceModel>(), new QuickBooksRepository<InvoiceModel>());
    var filter = new InvoicesSearchFilter();
    try
    {
        var items = await service.GetItemsAsync(filter);
        return items.Count;
    }
    catch (Exception ex)
    {


    }
    return 0;
}

public async Task<int> PullPaymentsAsync()
{
    var service = new DesktopConnectorService<PaymentModel>(
        new WapiRepository<PaymentModel>(), new QuickBooksRepository<PaymentModel>());
    var filter = new PaymentSearchFilter();
    try
    {
        var items = await service.GetItemsAsync(filter);
        return items.Count;
    }
    catch (Exception ex)
    {


    }
    return 0;
}
public异步任务PullClientsAsync()
{
var服务=新DesktopConnectorService(
新的WapiRepository(),新的QuickBooksRepository());
var filter=new ClientSearchFilter();
尝试
{
var items=await service.GetItemsAsync(过滤器);
返回项目。计数;
}
捕获(例外情况除外)
{
}
返回0;
}
公共异步任务PullInvoicesAsync()
{
var服务=新DesktopConnectorService(
新的WapiRepository(),新的QuickBooksRepository());
var filter=new InvoicesSearchFilter();
尝试
{
var items=await service.GetItemsAsync(过滤器);
返回项目。计数;
}
捕获(例外情况除外)
{
}
返回0;
}
公共异步任务PullPaymentsAsync()
{
var服务=新DesktopConnectorService(
新的WapiRepository(),新的QuickBooksRepository());
var filter=新的PaymentSearchFilter();
尝试
{
var items=await service.GetItemsAsync(过滤器);
返回项目。计数;
}
捕获(例外情况除外)
{
}
返回0;
}
正如您所看到的,它都是关于三种类型(ClientModel、PaymentModel和Invoices model)。上面的许多代码都在重复

但我相信它可以简化。你知道怎么做到吗


谢谢

如果所有模型和过滤器共享一个通用接口/基类,您可以执行以下操作:

public async Task<int> PullAsync<TModel, TFilter>() 
                       where TModel : IModel, 
                       where TFilter : IFilter, new();
{
    var service = new DesktopConnectorService<TModel>(
                    new WapiRepository<TModel>(), new QuickBooksRepository<TModel>());
    var filter = new TFilter();
    try
    {
        var items = await service.GetItemsAsync(filter);
        return items.Count;
    }
    catch (Exception ex)
    {
    }
    return 0;
}
公共异步任务PullAsync() 其中TModel:IModel, 其中TFilter:IFilter,new(); { var服务=新DesktopConnectorService( 新的WapiRepository(),新的QuickBooksRepository()); var filter=新的TFilter(); 尝试 { var items=await service.GetItemsAsync(过滤器); 返回项目。计数; } 捕获(例外情况除外) { } 返回0; }
旁注-不要像那样使用空的catch块,它们会吞下异常,这使得诊断可能在以后发生的问题非常困难。至少有一个日志记录语句,或者做一些有意义的事情。否则,我将删除它。

为了澄清,最后一段Yuval的内容:吞咽异常是不好的,因为当你这样做时,如果你的程序出现错误,你不会立即得到反馈。这使得在问题发生时发现问题变得更加困难,因为您的代码正在积极地隐藏它。如果您在整个代码中不断地接受异常,那么您的软件就是一个无法维护的烂摊子。