【问题标题】:Is this overusing extension methods?这是过度使用扩展方法吗?
【发布时间】:2011-11-07 13:38:14
【问题描述】:

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

在我的 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 转换来提高透明度会更好吗?

【问题讨论】:

    标签: c# asp.net-mvc linq linq-to-objects func


    【解决方案1】:

    您可以将IDictionary&lt;,&gt; 直接绑定到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);
    

    【讨论】:

    • 你是对的!我觉得我的编码有点忘乎所以,忽略了最明显的解决方案。
    【解决方案2】:

    本指南来自深度 C#:

    "一个扩展方法是合理有效的,如果它适用于所有 扩展类型的实例。如果它只适用于某些 情况,然后清楚地表明该方法不是类型的一部分 将其保留为“正常”静态方法”。

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

    为了让最终用户清楚,我宁愿将扩展方法称为ToSelectListItem,而不是ToSelectList。这也是我个人的喜好。

    【讨论】:

    • 谢谢!我对使用 SeletListItem 有点不满意,所以我将扩展方法更改为返回 IEnumerable>,这让我更高兴将它暴露给 IEnumerable 的所有实例。
    【解决方案3】:

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

    只要他们的名字是描述性的,并且按照他们说的去做,你就不应该有问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      相关资源
      最近更新 更多