Передать тип переменной модели в функцию C # в MVC для упрощения кода - PullRequest
2 голосов
/ 16 июня 2011

У меня есть набор процедур обновления модели, которые меняются только в зависимости от переданной модели, например:

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 Ответ

2 голосов
/ 16 июня 2011

Один из вариантов - заставить каждую вашу модель реализовывать один и тот же интерфейс:

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...