如何为动态类型

时间:2016-08-25 16:53:41

标签: c# asp.net-mvc asp.net-4.5

我想为动态类型创建扩展方法,但由于某些原因,我在编译代码时遇到错误。下面是我的代码示例 我正在使用的方法是

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)

任何人都可以提供帮助

2 个答案:

答案 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);

    }
}