这是过度使用扩展方法吗?

本文关键字:扩展 方法 | 更新日期: 2023-09-27 18:13:56

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

在我的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, Func<T, string> text)
    {
        return enumerable.Select(f => new SelectListItem()
        {
            Value = value(f),
            Text = text(f),
        });
    }

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

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

现在,我要做的就是:

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

我也有类似的方法,比如。todictionary。

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

这是过度使用扩展方法吗?

您可以将IDictionary<,>直接绑定到DropDownList DataSource,在WebForms中您需要指定像DataValueField="Key"DataTextField="Value"这样的映射。考虑到为什么不直接使用LINQ ToDictionary()方法?

dropDownList.DataValueField = "Key";
dropDownList.DataTextField = "Value";
dropDownList.DataSource = 
                SessionTypes.ToDictionary(k => k.ID.ToString(), 
                                          v => v.Title);

本指南来自c# in Depth:

"一个扩展方法是合理有效的,如果它适用于所有扩展类型的实例。如果只是在某些情况下是合适的情况下,然后明确该方法不是类型by的一部分将其保留为"普通的"静态方法。

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

在一个轻松的注释中,我宁愿将扩展方法称为ToSelectListItem,而不是ToSelectList,以使最终用户更清楚。这也是我个人的偏好

这是一个完全可以接受的扩展方法的用法。

只要他们是描述性的命名,并按照他们说的做,你应该没有问题。