make方法通用于不同的viewmodel

时间:2016-06-13 15:14:11

标签: c# asp.net-mvc generics

我有一个接受一个视图模型的方法。我必须为不同的viewmodel复制相同的方法。我试过像functionname(t model)这样的东西,但它没有用。我是泛型的新手。 有人可以帮助我

       private void SetUpUserTypeDropDown(RegisterViewModel model)
    {
        var usertypes = GetuserTypes();
        model.UserTypes = new List<SelectListItem> { };
        usertypes.ForEach(t => model.UserTypes.Add(new SelectListItem() { Text = t.Text, Value = t.Value }));
    }


     private void SetUpUserforBackOfficeTypeDropDown(BackOfficeViewModel model)
    {
        var usertypes = GetuserTypes();
        model.UserTypes = new List<SelectListItem> { };
        usertypes.ForEach(t => model.UserTypes.Add(new SelectListItem() { Text = t.Text, Value = t.Value }));
    }
      private void SetUpProfileTypeDropDown(MyProfileViewModel model)
    {
        var usertypes = GetuserTypes();
        model.UserTypes = new List<SelectListItem> { };
        usertypes.ForEach(t => model.UserTypes.Add(new SelectListItem() { Text = t.Text, Value = t.Value }));
    }

我被迫复制粘贴使用不同方法名称的相同代码。我可以在这方面得到一些帮助,如何制作一个将输入视图模型作为通用输入的通用方法

1 个答案:

答案 0 :(得分:2)

由于您的所有*ViewModel - 类都有UserTypes类型List<SelectListItem>的属性,因此您可以考虑为所有*ViewModel创建基类:

public class ViewModelBase
{
    public List<SelectListItem> UserTypes { get; set; }
    // ... further code?
}

并从该类继承您的视图模型,例如:

public class RegisterViewModel : ViewModelBase
{
    // implement specific behaviour
}

然后您的方法不需要是通用的,但可以简单地将ViewModelBase作为参数:

private void SetUpUserType(ViewModelBase model)
{
    var usertypes = GetuserTypes();
    model.UserTypes = new List<SelectListItem> { };
    usertypes.ForEach(t => model.UserTypes.Add(new SelectListItem() { Text = t.Text, Value = t.Value }));
}

为了完整起见,您可以使此方法具有通用性:

private void SetUpUserType<T>(T model) where T : ViewModelBase
{
    var usertypes = GetuserTypes();
    model.UserTypes = new List<SelectListItem> { };
    usertypes.ForEach(t => model.UserTypes.Add(new SelectListItem() { Text = t.Text, Value = t.Value }));
}

并使用约束(where T : ViewModelBase)确保它是从支持该ViewModelBase属性的UserTypes派生的类型。