【问题标题】:How to create MVC Extension Method for Dynamic type如何为动态类型创建 MVC 扩展方法
【发布时间】:2016-08-26 01:54:02
【问题描述】:

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

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)' 有一些无效参数

我想使用这样的扩展方法,但我遇到了错误

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

谁能帮忙

【问题讨论】:

  • 这段代码为我编译。你遇到了什么错误?
  • @stephen.vakil 嗨,我已经更新了错误,请看一下。谢谢
  • @LijinJohn,该扩展方法不会按照您的描述进行。你可以使用反射和泛型

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


【解决方案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);

    }
}

【讨论】:

  • 我想这是我们实现它的唯一方法。谢谢你的时间。我实际上想通过调用一个方法来创建一个方法,可以很容易地在 MVC 中绑定一个下拉列表
【解决方案2】:

不支持扩展方法中的动态类型。 将动态类型转换为实际类型,它将起作用。 有关更多详细信息,请查看以下 URL, Extension methods cannot be dynamically dispatched

【讨论】:

  • 我已经更新了我的代码,请你看一下,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 2015-08-18
  • 2011-04-22
相关资源
最近更新 更多