How to write generic IEnumerable<SelectListItem> extension method

c#, extension-methods, generics

Solution

Well, you could do something like this:

public static IEnumerable<SelectListItem> ToSelectListItems(
     this IEnumerable<T> items, 
     Func<T,string> nameSelector, 
     Func<T,string> valueSelector, 
     Func<T,bool> selected)
{
     return items.OrderBy(item => nameSelector(item))
            .Select(item =>
                    new SelectListItem
                    {
                        Selected = selected(item),
                        Text = nameSelector(item),
                        Value = valueSelector(item)
                    });
}

Problem

I'm fairly new (ok, REALLy new) to generics but I love the idea of them. I am going to be having a few drop-down lists on a view and I'd like a generic way to take a list of objects and convert it to a list of `SelectListItems` What I have now: ``` public static IEnumerable<SelectListItem> ToSelectListItems( this IEnumerable<SpecificObject> items, long selectedId) { return items.OrderBy(item => item.Name) .Select(item => new SelectListItem { Selected = (item.Id == selectedId), Text = item.Name, Value = item.Id.ToString() }); } ``` Trouble is, I'd need to repeat that code for each drop-down as the objects have different fields that represent the `Text` property of the `SelectListItem` Here is what I'd like to accomplish: ``` public static IEnumerable<SelectListItem> ToSelectListItem<T>(this IEnumerable<T> items, string key, string value, int SelectedId) { // I really have no idea how to proceed from here :( } ```

Original source