2016-08-25 86 views
1

我想爲動態類型創建擴展方法,但出於某些原因,在編譯代碼時出現錯誤。下面是我的代碼示例 這我使用的方法是如何爲動態類型創建MVC擴展方法

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

我的編譯錯誤,我得到的是

編譯器錯誤信息:CS1928 : 'System.Collections.Generic.List' 不包含'getIntoDropDownState'的定義,並且最佳的 擴展符合HOD超載 「LearnAuthentication.Controllers.helper.getIntoDropDownState(System.Collections.Generic.List, 字符串,字符串)」有一些無效參數

我想用這樣的擴展方法,而我面對不支持錯誤

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

任何人都可以幫助

+0

此代碼編譯爲我。你遇到了什麼錯誤? –

+0

@ stephen.vakil你好我已更新錯誤,請看看。謝謝 –

+1

@LijinJohn,那個擴展方法不會做你所描述的。你可以使用反射和泛型 – Nkosi

回答

1

您示例中的擴展方法不會執行您所描述的操作。你可以使用反射和泛型。

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

下面是擴展方法的單元測試

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

或者你也可以放棄思考和使用System.Web.Mvc.SelectList其執行繁重的反射提升你

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

我想這是我們能做到的唯一方法。謝謝你的時間。我其實想通過調用哪個下拉列表很容易在MVC中綁定來創建一個方法 –