我想重构这两种方法,唯一的区别是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)
的方法。似乎有一种方法可以使用表达式树来完成此操作,但我无法找到我想要做的任何确切示例,谢谢。
答案 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
对象。