我想为动态类型创建扩展方法,但由于某些原因,我在编译代码时遇到错误。下面是我的代码示例 我正在使用的方法是
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'的定义和最佳定义 扩展方法重载 “LearnAuthentication.Controllers.helper.getIntoDropDownState(System.Collections.Generic.List, string,string)'有一些无效的参数
我想像这样使用Extension方法,我正面临错误
@Html.DropDownListFor(x => x.StateID, new LearnAuthentication.Controllers.Address().getStates().getIntoDropDownState("StateName", "StateID"), "Select State", 0)
任何人都可以提供帮助
答案 0 :(得分:1)
不支持扩展方法中的动态类型。 将动态类型转换为实际类型,它将起作用。 有关详细信息,请查看以下网址, Extension methods cannot be dynamically dispatched
答案 1 :(得分: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);
}
}