将强类型属性名称作为参数的方法

时间:2014-05-19 20:37:05

标签: c#

我想重构这两种方法,唯一的区别是currentUser对象上的属性得到更新(以及参数名称,但这并不重要)。

public User SaveBaselineModelTemplateId(int baselineModelTemplateId)
{
    using (var db = _contextFactory.GetContext())
    {
        var currentUser = db.Users.Single(x => x.Login == Environment.UserName);
HERE -> currentUser.BaselineModelTemplateID = baselineModelTemplateId; 
        db.SaveChanges();
        return currentUser;
    }
}

public User SaveComparisonModelTemplateId(int comparisonModelTemplateId)
{
    using (var db = _contextFactory.GetContext())
    {
        var currentUser = db.Users.Single(x => x.Login == Environment.UserName);
HERE -> currentUser.ComparisonModelTemplateID = comparisonModelTemplateId; 
        db.SaveChanges();
        return currentUser;
    }
}

我想要一种我可以称之为SaveInt(ComparisonModelTemplateID, 42)SaveInt(x => x.ComparisonModelTemplateID, 42)的方法。似乎有一种方法可以使用表达式树来完成此操作,但我无法找到我想要做的任何确切示例,谢谢。

1 个答案:

答案 0 :(得分:5)

你不需要一个表达式树 - 一个简单的Action<User>就足够了:

private User ModifyAndSave(Action<User> modify) {
    using (var db = _contextFactory.GetContext())
    {
        var currentUser = db.Users.Single(x => x.Login == Environment.UserName);
        modify(currentUser);
        db.SaveChanges();
        return currentUser;
    }
}
public User SaveBaselineModelTemplateId(int baselineModelTemplateId)
{
     return ModifyAndSave(u => u.BaselineModelTemplateID = baselineModelTemplateId);
}
public User SaveComparisonModelTemplateId(int comparisonModelTemplateId)
{
     return ModifyAndSave(u => u.ComparisonModelTemplateID = comparisonModelTemplateId);
}

上述两种public方法将不同的操作传递给上面的常见ModifyAndSave方法。常用方法采用Action<User>,告诉它在保存修改之前如何处理从数据库中检索的User对象。

相关问题