asp.net mvc 3-将可变模型类型传递给mvc中的C#函数以简化代码

本文关键字:mvc 中的 函数 代码 net 类型 模型 asp | 更新日期: 2023-09-27 17:59:27

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

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();
}

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

asp.net mvc 3-将可变模型类型传递给mvc中的C#函数以简化代码

一个选项是让每个模型实现相同的接口:

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, ...)

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

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);调用。

希望这能有所帮助。