2016-06-13 9 views
0

Ich habe eine Methode, die ein Viewmodel akzeptiert. Ich muss die gleiche Methode für verschiedene Ansichtsmodelle replizieren. Ich habe versucht, etwas wie Funktionsname (t-Modell), aber es hat nicht funktioniert. Ich bin neu in Generika. Kann jemand mir helfen,make method generic für verschiedene viewmodel

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

kopiere ich bin gezwungen, zu demselben Code mit unterschiedlichen Methodennamen einfügen. Kann ich etwas Hilfe in dieser Hinsicht bekommen, wie eine generische Methode, um die Eingabe View-Modell als generische Eingabe hat

+0

Ich nehme an, Ihr 'ViewModel's alle erben von einer singulären Schnittstelle? –

+0

sollten Sie ein abstraktes Viewmodel mit den gemeinsamen Feldern erstellen. – lem2802

Antwort

2

Da alle Ihre *ViewModel -Klassen hat eine Eigenschaft UserTypes vom Typ namens List<SelectListItem> Sie zum Erstellen einer Basisklasse für alle denken können *ViewModel s:

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

und Ihre Ansicht Modelle von dieser Klasse erben, zum Beispiel:

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

dann Ihre Methode muss nicht generisch sein, sondern kann einfach nehmen ein ViewModelBase als Parameter:

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

Nur der Vollständigkeit halber, Sie kann diese Methode machen generic:

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

und verwenden Sie die Beschränkung (where T : ViewModelBase) sicherzustellen, dass es eine Art ist, abgeleitet von ViewModelBase unterstützt diese UserTypes Eigenschaft.

+0

Dies ist die richtige Lösung und verwendet keine Generika, sondern eine vererbungsbasierte Technik. Sie könnten Generika verwenden, aber es gibt keinen Grund, sie hier zu verwenden, da das einzige, was zählt, ist, dass das Modell ViewModelBase erbt. – TwistedStem