简体   繁体   中英

Refactor methods - pass in property name

I'm wondering if it's possible to refactor these two methods into one. The only difference is in the Select method; one uses BaselineSetNumber, the other 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);
    }
}

I'd like to have a method that I can call like LoadSet(sets, BaselineSetNumber); or LoadSet(sets, ComparisonSetNumber);

Yes, this is possible by creating a higher-order function . Your new code would look something like this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM