扩展方法IEnumerable<T>转换为IList<SelectListItem> ,提供@Html.DropDownList使用

由于在MVC中经常会使用到@Html.DropDownList方法,而该方法接收的是List<SelectListItem> 参数,因此就想着写一个扩展方法,直接把IEnumerable转换为List<SelectListItem>类型,这样使用起来会比较方便

正式进入正文。

1、首先创建下面实体:

 //水果类
    public class Fruit
    {
        public string Code { get; set; }
        public string Name { get; set; }
        public string Color { get; set; }
    }

2、编写扩展方法,把IEnumerable转换为List<SelectListItem>类型,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using System.Web.Mvc;

namespace Common
{
    public static class Extensions
    {
        /// <summary>
        /// 扩展方法,IEnumerable<T>转换为IList<SelectListItem>
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="data">带转换的数据</param>
        /// <param name="Text"></param>
        /// <param name="Value"></param>
        /// <param name="selectValue"></param>
        /// <param name="NewItem">传递过来的SelectListItem,如请选择……</param>
        /// <returns></returns>
        public static IList<SelectListItem> ToSelectListItem<T>(this IEnumerable<T> data, Expression<Func<T, object>> Text, Expression<Func<T, object>> Value, string selectValue = "",SelectListItem NewItem=null) where T : class,new()
        {
            var list = new List<SelectListItem>();
            if (NewItem != null)
            {
                list.Add(NewItem);
            }
            string _text = "";
            string _value = "";
            if (Text.Body is MemberExpression)
            {
                MemberExpression TextMember = (MemberExpression)Text.Body;
                _text = TextMember.Member.Name;
            }
            else if (Text.Body is UnaryExpression)
            {
                UnaryExpression TextMember = (UnaryExpression)Value.Body;
                _text = (TextMember.Operand as MemberExpression).Member.Name;
            }
            if (Value.Body is MemberExpression)
            {
                MemberExpression ValueMember = (MemberExpression)Text.Body;
                _value = ValueMember.Member.Name;
            }
            else if (Value.Body is UnaryExpression)
            {
                UnaryExpression ValueMember = (UnaryExpression)Value.Body;
                _value = (ValueMember.Operand as MemberExpression).Member.Name;
            }
            var type = new T().GetType();
            var TextPropertyInfo = type.GetProperty(_text);
            var ValuePropertyInfo = type.GetProperty(_value);
            foreach (var item in data)
            {
                var selectItem = new SelectListItem() { Text = TextPropertyInfo.GetValue(item).ToString(), Value = ValuePropertyInfo.GetValue(item).ToString() };
                if (!string.IsNullOrWhiteSpace(selectValue) && selectValue == selectItem.Value)
                {
                    selectItem.Selected = true;
                }
                list.Add(selectItem);
            }

            return list;
        }

    }

3、调用方法如下:

ViewBag.Fruits = list.ToSelectListItem(it => it.Name, it => it.Color, "", new SelectListItem() { Text = "请选择水果", Value = "", Selected = true });

 @Html.DropDownList("Fruits ",ViewBag.Fruits as IList<SelectListItem>)          

扩展方法IEnumerable<T>转换为IList<SelectListItem> ,提供@Html.DropDownList使用

时间: 2024-11-04 12:14:19

扩展方法IEnumerable<T>转换为IList<SelectListItem> ,提供@Html.DropDownList使用的相关文章

使用扩展方法将DataTable转换为List&lt;T&gt;

在将DataTable转换为List<T>时,找到了网上的方案,原文链接:http://stackoverflow.com/questions/4593663/fetch-datarow-to-c-sharp-object. 使用时,遇到DbNull无法正常转换的问题,所以做了修正补充,继续发代码上来. 欢迎补充修正. using System; using System.Collections.Generic; using System.Linq; using System.Data; us

泛型集合的静态扩展方法

C# 中的泛型集合提供了很多基于 Enumerable 的静态扩展方法,例如  Find,  OrderBy , Average ,Distinct 等,在使用基础数据类型的集合时,可以直接调用这些方法,但如果是自定义类型就应当根据扩展方法所要求的接口,实现自定类型的扩展接口类,其实质就是使用扩展类的实例方法完成特定的操作逻辑,否则对集合的操作将是无效的.本文以 OrderBy 为例进行说明 . 首先需要一个自定义的类 ,这是一个表示自然人属性的简单类,列出了姓名.年龄和性别(这里使用了枚举类型

Linq入门——什么是linq &amp; 扩展方法

一,什么是Linq linq(language integrated Query):语言集成查询: linq包含如下: 对对象的查询,对数据库的查询,对XML的查询. 那么,没有linq前我们是怎样查询的? 先看一个例子: 现在我们要查询大于50的数,: 在没有linq之前,我们的代码时这样的: 使用了linq查询: 首先,从直观上看,代码更加简洁,其次,对于查询部分,接近SQL语句,层次清晰,容易理解: 除了简单高效以为,LINQ的出现解决了很多问题: 1,面向对象与数据访问两个领域长期分裂,

Extension Methods(扩展方法)

在 OOPL 中,有静态方法.实例方法和虚方法,如下: public sealed class String { public static bool  IsNullOrEmpty(string s) { // ... } public string Replace(string old, string new) { // ... } } public abstract class Stream { public virtual void WriteByte(byte value) { // .

JavaScript学习总结(十四)——JavaScript编写类的扩展方法

在?J?a?v?a?S?c?r?i?p?t?中?可以使?用?类的p?r?o?t?o?t?y?p?e属性来?扩?展?类的属?性?和?方?法,在实际开发当中,当JavaScript内置的那些类所提供的动态方法和动态属性不满足我们实际开发时,我们就可以通过"prototype"属性给自定义类添加方法和属性或者扩展原有的类中的方法和属性. 一.扩展JavaScript内置类,添加动态方法 语法格式: 类名.prototype.方法名 = function([param1],[param2],.

.net 扩展方法,lamada表达式 委托

扩展方法 (1)扩展方法是一种特殊的静态方法,它定义在一个静态类中,但可以在其他类的对象上向调用实例方法那样进行调用.因此,通过扩展方法,我们就可以在不修改一个类型的前提下对一个类型进行功能上的扩充,这种方法并不会产生新的类型,而是采用向已有类中加入新方法的方式来完成功能的扩展. (2)在对已有类进行扩展时,我们需要将所有的扩展方法都写在一个静态类中,这个静态类就相当于存放扩展方法的容器,所有的扩展方法都可以写在这里面.扩展方法与普通方法的声明方式不同,扩展方法的第一个参数以this关键字开始,

为IEnumerable&lt;T&gt;添加RemoveAll&lt;IEnumerable&lt;T&gt;&gt;扩展方法--高性能篇

最近写代码,遇到一个问题,微软基于List<T>自带的方法是public bool Remove(T item);,可是有时候我们可能会用到诸如RemoveAll<IEnumerable<T>>的方法,坦白的说,就是传入的参数是一个IEnumerable<T>,而不是一个T,这种情景是随时可能用到的.当然我们会轻易的发现List<T>里本身就封装了一个方法public int RemoveAll(Predicate<T> match)

IEnumerable接口的扩展方法

/// <summary>/// IEnumerable接口的扩展方法,支持它的实现类是List的情况/// </summary>using System.Collections.Generic;public static class IEnumerableExtensions{ /// <summary> /// 向集合中添加元素 /// </summary> /// <typeparam name="T"></typ

飞波拿鸡(要定义IEnumerable&lt;T&gt;的ForEach扩展方法):

var N = 20; var list = Enumerable.Range(0, N).ToArray(); N = list.ForEach(n => list[n] = n < 2 ? n : list[n - 1] + list[n - 2]).Last(); 飞波拿鸡(要定义IEnumerable<T>的ForEach扩展方法):