C# 用泛型重构重复的方法

C# 用泛型重构重复的方法,c#,generics,refactoring,C#,Generics,Refactoring,我有一些方法。如何重构此代码以使用泛型方法 第一种方法: void ChangeProjectName(DataModel dataModel) { foreach (Project project in dataModel.Projects) { string projectName = project.Name; projectName = ChangeName(projectName);

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

第一种方法:

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

如果希望避免使用
IHaveName
接口(或基类等),可以添加
Action
参数并传递它
x=>x.Name=ChangeName(x.Name)

我们必须能够从模型中的相应属性获取
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();
}

如果希望避免使用
IHaveName
接口(或基类等),可以添加
Action
参数并传递它
x=>x.Name=ChangeName(x.Name)

我认为最好将更改名称与提交数据分开

void ChangeName<T>(IEnumerable<T> list) where T : IHaveName
{ 
    foreach (T item in list)
    {
        item.Name = ChangeName(project.Name);
    }
}

void ChangeNamesAndSubmitChanges(dataModel dataModel)
{ 
    ChangeName(dataModel.Projects);
    ChangeName(dataModel.Employees);
    dataModel.SubmitChanges();
}
void ChangeName(IEnumerable列表),其中T:IHaveName
{ 
foreach(列表中的T项)
{
item.Name=变更名称(project.Name);
}
}
无效更改名称和提交更改(数据模型数据模型)
{ 
ChangeName(dataModel.Projects);
ChangeName(dataModel.Employees);
dataModel.SubmitChanges();
}

或者按照Yorye Nathan的建议创建变更名称并与委托人一起提交变更。

我认为最好将变更名称与提交数据分开

void ChangeName<T>(IEnumerable<T> list) where T : IHaveName
{ 
    foreach (T item in list)
    {
        item.Name = ChangeName(project.Name);
    }
}

void ChangeNamesAndSubmitChanges(dataModel dataModel)
{ 
    ChangeName(dataModel.Projects);
    ChangeName(dataModel.Employees);
    dataModel.SubmitChanges();
}
void ChangeName(IEnumerable列表),其中T:IHaveName
{ 
foreach(列表中的T项)
{
item.Name=变更名称(project.Name);
}
}
无效更改名称和提交更改(数据模型数据模型)
{ 
ChangeName(dataModel.Projects);
ChangeName(dataModel.Employees);
dataModel.SubmitChanges();
}

或者按照Yorye Nathan的建议创建变更名称并与代表一起提交变更。

我同意。我希望
ChangeMethod
只更改名称,并在堆栈较高的适当位置调用
SubmitChanges
。您的
foreach
循环应该使用
T
作为类型,而不是
Project
。我同意。我希望
ChangeMethod
只更改名称,并在堆栈上较高的适当位置调用
SubmitChanges
。您的
foreach
循环应该使用
T
作为类型,而不是
Project