2011-11-07 53 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

你說得對!我認爲我有點忘記了我的編碼,忽視了最明顯的解決方案。 –