Я бы хотел реорганизовать эти два метода, единственное отличие - это свойство объекта 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)
. Кажется, есть способ сделать это с помощью деревьев выражений, но я не мог найти точных примеров того, что я ищу, спасибо.
Для этого вам не требуется дерево выражений - достаточно простого 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
полученным из базы данных, до сохранения изменений.