2016-08-25 3 views
1

Ich möchte Erweiterungsmethoden für den dynamischen Typ erstellen, aber aus dem einen oder anderen Grund bekomme ich Fehler beim Kompilieren des Codes. unten ist mein Codebeispiel Die Methode, die ich benutze istSo erstellen Sie MVC-Erweiterungsmethode für den dynamischen Typ

public List<State> getStates() 
{ 

    return new List<State>(){ 
     new State{StateID="1",StateName="Tamil Nadu"}, 
     new State{StateID="2",StateName="Assam"}, 
     new State{StateID="3",StateName="Andra"}, 
     new State{StateID="4",StateName="bihar"}, 
     new State{StateID="5",StateName="Bengal"},    
    }; 
} 

und meine Erweiterungsmethode ist

public static class helper 
{ 
    public static IEnumerable<SelectListItem> getIntoDropDownState(this List<dynamic> data,string textField,string valueField) 
    { 
     return data.Select(x => new SelectListItem 
     { 
      Text = x.textField, 
      Value = x.valueField 
     }); 
    } 
} 

Mein Übersetzungsfehler, die ich bekommen ist

Compiler-Fehlermeldung: CS1928 : 'System.Collections.Generic.List' enthält keine Definition für 'getIntoDropDownState' und die beste Erweiterung erfüllt hod Überlastung ‚LearnAuthentication.Controllers.helper.getIntoDropDownState (System.Collections.Generic.List, string, string)‘ hat einige ungültige Argumente

Ich möchte die Erweiterung Methode wie folgt verwenden, und ich bin vor Fehler

@Html.DropDownListFor(x => x.StateID, new LearnAuthentication.Controllers.Address().getStates().getIntoDropDownState("StateName", "StateID"), "Select State", 0) 

kann jeder

+0

für mich Dieser Code kompiliert . Welchen Fehler bekommst du? –

+0

@ stephen.vakil Hallo, ich habe den Fehler aktualisiert, bitte schauen Sie. Vielen Dank –

+1

@ LijinJohn, Diese Erweiterungsmethode wird nicht tun, was Sie beschreiben. Sie könnten Reflexion und Generika verwenden – Nkosi

Antwort

1

Diese Erweiterungsmethode in Ihrem Beispiel wird nicht tun, was Sie beschreiben. Sie könnten Reflexion und Generika verwenden.

public static class helper { 
    public static IEnumerable<SelectListItem> getIntoDropDownState<T>(this List<T> data, string textField, string valueField) where T : class { 
     var type = typeof(T); 

     var textPropertyInfo = type.GetProperty(textField); 
     var valuePropertyInfo = type.GetProperty(valueField); 

     return data.Select(x => new SelectListItem { 
      Text = (string)textPropertyInfo.GetValue(x), 
      Value = (string)valuePropertyInfo.GetValue(x) 
     }); 
    } 
} 

Hier ist ein Unit-Test für die Erweiterung Methode

[TestClass] 
public class MyTestClass { 
    [TestMethod] 
    public void MyTestMethod() { 
     //Arrange 
     var data = getStates(); 

     //Act 
     var result = data.getIntoDropDownState("StateName", "StateID"); 

     //Assert 
     Assert.IsNotNull(result); 
     var first = result.First(); 
     Assert.AreEqual(data[0].StateName, first.Text); 
     Assert.AreEqual(data[0].StateID, first.Value); 
    } 

    public List<State> getStates() { 

     return new List<State>(){ 
      new State{StateID="1",StateName="Tamil Nadu"}, 
      new State{StateID="2",StateName="Assam"}, 
      new State{StateID="3",StateName="Andra"}, 
      new State{StateID="4",StateName="bihar"}, 
      new State{StateID="5",StateName="Bengal"},    
     }; 
    } 

    public class State { 
     public string StateID { get; set; } 
     public string StateName { get; set; } 
    } 
} 

Oder Sie könnten Reflexion verzichten und System.Web.Mvc.SelectList verwenden, die für Sie die schwere Reflexion Hebe tut

public static class helper { 
    public static IEnumerable<System.Web.Mvc.SelectListItem> getIntoDropDownState<T>(this List<T> data, string textField, string valueField) where T : class { 

     return new System.Web.Mvc.SelectList(data, valueField, textField); 

    } 
} 
+0

Ich denke, das ist der einzige Weg, wie wir es möglich machen können. Danke für die Zeit. Ich wollte eigentlich eine Methode erstellen, indem ich anrufe, welches Drop-down leicht in MVC gebunden werden könnte –

1

Dynamische Typen in Erweiterungsmethoden helfen wird nicht unterstützt. Konvertieren Sie die dynamischen Typen in tatsächliche Typen, und es wird funktionieren. Für weitere Details überprüfen Sie die folgende URL, Extension methods cannot be dynamically dispatched

+0

Ich habe meinen Code aktualisiert können Sie bitte einen Blick darauf, danke –

Verwandte Themen