我想重构这两个方法,唯一的区别是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).似乎有一种方法可以使用表达式树来完成此操作,但是我找不到任何我想要做的确切示例,谢谢.
你不需要一个表达式树 - 一个简单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在保存修改之前如何处理从数据库中检索的对象.