2011-11-07 22 views
3

我正在寻找尽可能通用的某些功能。这是过度使用扩展方法吗?

在我的MVC应用程序我有一些复杂的IEnumerable对象转换为SelectLists的下拉列表显示等

起初,我创建了每个复杂对象的转换方法的静态列表类。这相当于很多代码。接下来我开始使用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转换进行透明度会更好吗?

回答

2

这个方针是从C#中深度:

“的扩展方法是,如果它是适用于扩展类型的所有 情况下,合理有效的,如果它只是在某些 情况合适,于是。明确指出该方法不属于 类型的一部分,将其作为“常规”静态方法“。

只要您在将IEnumerable类型的所有实例暴露给此扩展方法时都是okey,那么您就很好。

对于一个较轻的笔记,我宁愿将扩展方法称为ToSelectListItem而不是ToSelectList,以便为最终用户说清楚。这又是我个人的偏好。

+0

谢谢!我有点不高兴使用SeletListItem,所以我改变了扩展方法来返回IEnumerable >,这让我有点高兴,因为它暴露给IEnumerable的所有实例。 –

2

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

只要它们被描述性地命名并做他们认为你应该没有问题的东西。

3

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

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

你说得对!我认为我有点忘记了我的编码,忽视了最明显的解决方案。 –