重构方法 - 传入属性名称

时间:2014-05-16 19:54:40

标签: c#

我想知道是否可以将这两种方法重构为一种方法。唯一的区别在于Select方法;一个使用BaselineSetNumber,另一个使用ComparisonSetNumber。

public Set LoadBaselineSet(ObservableCollection<Set> sets)
{
    using (var db = _contextFactory.GetContext())
    {
        var setNumber =
            db.Users.Where(x => x.Login == Environment.UserName)
                    .Select(x => x.BaselineSetNumber).Single(); // !!! HERE
        return sets.Single(x => x.SetNumber == setNumber);
    }
}

public Set LoadComparisonSet(ObservableCollection<Set> sets)
{
    using (var db = _contextFactory.GetContext())
    {
        var setNumber =
            db.Users.Where(x => x.Login == Environment.UserName)
                    .Select(x => x.ComparisonSetNumber).Single(); // !!! HERE
        return sets.Single(x => x.SetNumber == setNumber);
    }
}

我想要一个我可以调用的方法,如LoadSet(sets, BaselineSetNumber);LoadSet(sets, ComparisonSetNumber);

1 个答案:

答案 0 :(得分:4)

是的,可以通过创建higher-order function来实现。您的新代码看起来像这样:

public Set LoadBaselineSet(ObservableCollection<Set> sets)
{
    return LoadSet(sets, (x) => x.BaselineSetNumber)
}

public Set LoadComparisonSet(ObservableCollection<Set> sets)
{
    return LoadSet(sets, (x) => x.ComparisonSetNumber)
}

public Set LoadSet(ObservableCollection<Set> sets, Func<dbObject, Int> elementIdentity){
        using (var db = _contextFactory.GetContext())
    {
        var setNumber =
            db.Users.Where(x => x.Login == Environment.UserName)
                    .Select(elementIdentity).Single(); // !!! HERE
        return sets.Single(x => x.SetNumber == setNumber);
    }
}