加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 这是否过度使用扩展方法?

发布时间:2020-12-16 01:48:52 所属栏目:百科 来源:网络整理
导读:我希望使某些功能尽可能通用. 在我的MVC应用程序中,我必须将许多复杂的IEnumerable对象转换为SelectLists以进行下拉显示等. 首先,我创建了一个静态List类,其中包含每个复杂对象的转换方法.这相当于很多代码.我接下来开始使用linq语句进行转换: var list = (
我希望使某些功能尽可能通用.

在我的MVC应用程序中,我必须将许多复杂的IEnumerable对象转换为SelectLists以进行下拉显示等.

首先,我创建了一个静态List类,其中包含每个复杂对象的转换方法.这相当于很多代码.我接下来开始使用linq语句进行转换:

var list = (from o in SessionTypes select new SelectListItem { Value = o.ID.ToString(),Text = o.Title }).ToList();

但同样,当接受许多此类转换时,仍然需要很多代码.

我终于解决了类似的问题:

public IEnumerable<SelectListItem> ToSelectList<T>(IEnumerable<T> enumerable,Func<T,string> value,string> text)
    {
        return enumerable.Select(f => new SelectListItem()
        {
            Value = value(f),Text = text(f),});
    }

为了使它更容易使用,我把它作为一种扩展方法:

public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable,});
    }

所以现在,我所要做的就是:

var list = SessionTypes.ToSelectList(o => o.ID.ToString(),o => o.Title) as List<SelectListItem>;

我也有类似的方法,例如.ToDictionary.

这是过度使用的扩展方法吗?我担心我在扩展方法中隐藏了太多代码,这可能会扭曲我的模型,使用linq转换来提高透明度会更好吗?

解决方法

本指南来自C#深度:

“An extension method is reasonably valid if it’s applicable to all
instances of the extended type. If it’s only appropriate in certain
situations,then make it clear that the method is not part of type by
leaving it as a “normal” static method”.

只要您在IEnumerable类型的所有实例上公开此扩展方法,那么您就可以了.

在较轻松的说明中,我宁愿将扩展方法称为ToSelectListItem,而不是ToSelectList,以使最终用户清楚.这也是我个人的偏好.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读