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

reg*_*tar 1 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

das*_*ght 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);
}
Run Code Online (Sandbox Code Playgroud)

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