2016-06-13 51 views
0

我有一個方法接受一個viewmodel。我必須爲不同的viewmodel複製相同的方法。我嘗試了像functionname(t模型)的東西,但它沒有工作。我對泛型很陌生。 有人能幫助我使方法通用於不同的視圖模型

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

我不得不復制粘貼用不同的方法名稱相同的代碼。我可以在這方面得到一些幫助,如何讓具有輸入視圖模型作爲通用輸入通用方法

+0

我認爲你的'ViewModel'全部是從單一接口繼承的? –

+0

您應該使用常用字段構建抽象視圖模型。 – lem2802

回答

2

由於所有*ViewModel - 班有一個屬性類型的名爲UserTypesList<SelectListItem>你可以考慮一下爲所有人創造一個基類*ViewModel S:

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屬性。

+0

這是正確的解決方案,不使用泛型,而是基於繼承的技術。你可以使用泛型,但沒有理由在這裏使用它們,唯一重要的是模型繼承了ViewModelBase。 – TwistedStem

相關問題