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

我希望使某些功能尽可能通用.

在我的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,以使最终用户清楚.这也是我个人的偏好.

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...