将变量模型类型传递给MVC中的C#函数以简化代码

时间:2011-06-16 00:52:47

标签: c# asp.net-mvc-3

我有一堆模型更新例程,只会随传递的模型而变化,例如:

public void UpdateAccount(AccountViewModel model)
{
    var _currentData = (from data in db.Accounts
                         where data.AccountId == model.AccountId
                         select data).Single();
    Mapper.Map(model, _currentData);
    Save();
}

我有许多类似的函数,其中传递的模型随数据键而变化。这可以更通用吗?

1 个答案:

答案 0 :(得分:2)

一种选择是让每个模型实现相同的界面:

interface IViewModel
{
    int AccountId { get; }
}

class AccountViewModel : IViewModel
{
    ...
}

然后,您可以将实现此接口的任何视图模型传递给UpdateAccount方法:

public void UpdateAccount(IViewModel model)
{
    var _currentData = (from data in db.Accounts
                        where data.AccountId == model.AccountId
                        select data).Single();
    Mapper.Map(model, _currentData);
    Save();

}

或者您可以将其定义为:

public void UpdateAccount<TViewModel>(TViewModel model) 
    where TViewModel: IViewModel { ... }

但是,这意味着您还必须更改Mapper.Map(...)方法的定义以接受新界面:Mapper.Map(IViewModel model, ...)

编辑:刚看到每个viewmodel都有一个不同的数据密钥(属性?),也许这是一个更好的解决方案:

public void UpdateAccount<T>(T model, Func<T, int> dataKeySelector)
{
    var _currentData = (from data in db.Accounts
                        where data.AccountID == dataKeySelector(model)
                        select data).Single();
    Mapper.Map(model, _currentData);
    Save();
}   

UpdateAccount(model, m => m.AccountID);可以调用哪个。

希望这有帮助。