2016-08-25 59 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中绑定来创建一个方法 –