c# - 使用泛型重构重复方法

标签 c# generics refactoring

我有一些方法。我如何重构此代码以使用泛型方法?

第一种方法:

    void ChangeProjectName(DataModel dataModel)
    { 
        foreach (Project project in dataModel.Projects)
        {
            string projectName = project.Name;
            projectName = ChangeName(projectName);

            project.Name = projectName;
        }

        dataModel.SubmitChanges();
    }

第二种方法:

    void ChangeEmployeeName(DataModel dataModel)
    {
        foreach (Employee employee in dataModel.Employees)
        {
            string employeeName = employee.Name;
            employeeName = ChangeName(employeeName);

            employee.Name = employeeName;
        }

        dataModel.SubmitChanges();
    }

最佳答案

我们必须能够得到 T从模型中适当的属性类型集合,所以我们必须为它传递一个选择策略:

void ChangeName<T>(DataModel dataModel,
                   Func<DataModel, IEnumerable<T>> selector)
    where T : IHaveName
{ 
    foreach (T x in selector(dataModel))
    {
        x.Name = ChangeName(x.Name);
    }

    dataModel.SubmitChanges();
}

和用法:

ChangeName(model, x => x.Projects);

您可以添加 Action<T>参数并传递给它 x => x.Name = ChangeName(x.Name)如果你想避免 IHaveName接口(interface)(或基类等)。

关于c# - 使用泛型重构重复方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31569446/

相关文章:

java - 匿名类作为泛型参数

c# - 使用 .Net 4.5 异步功能进行套接字编程

java - 在 Android 中通过 SSL 使用 WCF 服务

c# - SQL Server 插入/更新/删除和选择性能/死锁建议

斯卡拉的错误行为尝试优雅

c# - 重构两个方法以使用接口(interface)和/或泛型

java - 从具有日期比较的列表中删除

c# - 绑定(bind)到队列 <string>。 UI永不更新

java - 使用泛型、数组和compareTo()时出错

java - 运行时局部变量的泛型类型