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

本文关键字:参数 方法 强类型 属性 | 更新日期: 2023-09-27 18:04:02

我想重构这两个方法,唯一的区别是更新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对象。