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

标签 c# .net generics

我在 Controller 代码中有以下代码:

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;
}

如您所见,它主要涉及三种类型(ClientModel、PaymentModel 和 Invoices 模型)。上面有很多代码是重复的。

但我相信它可以简化。知道如何实现吗?

谢谢

最佳答案

如果所有模型和过滤器共享一个公共(public)接口(interface)/基类,您可以:

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;
}

旁注 - 不要像那样使用空的 catch block ,它们会吞下异常,这使得诊断稍后可能发生的问题变得非常困难。至少在那里有一个日志语句,或者做一些有意义的事情。否则,我会删除它。

关于c# - 在 C# 中避免代码重复 - 通过使用泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34130769/

相关文章:

c# - 无法在 Linux 上使用 SQLConnection 连接 Azure SQL

.net - 无法获得对 ConfigurationManager 的引用

C# 将可枚举转换为接口(interface)

Java 泛型转换

c# - 我可以更改用于 ODataController 请求的 ODataQueryOptions 吗?

c# - 使用不同的 Try 语句和相同的 Catch 语句进行 DRY

c# - 配置。保存在网络驱动器上

Java boolean addAll 方法和泛型类型参数问题

c# - Lucene.NET(字符串模糊匹配)

c# - log4net 特定类应使用 appender