Search code examples
asp.net-mvcdomain-driven-designselectlistselectlistitem

How to code a C# Extension method to turn a Domain Model object into an Interface object?


When you have a domain object that needs to display as an interface control, like a drop down list, ifwdev suggested creating an extension method to add a .ToSelectList().

The originating object is a List of objects that have properties identical to the .Text and .Value properties of the drop down list. Basically, it's a List of SelectList objects, just not of the same class name.

I imagine you could use reflection to turn the domain object into an interface object. Anyone have any suggestions for C# code that could do this? The SelectList is an MVC drop down list of SelectListItem.

The idea of course is to do something like this in the view:

<%= Html.DropDownList("City", 
         (IEnumerable<SelectListItem>) ViewData["Cities"].ToSelectList() )

Solution

  • It's easier to make the SelectList part of your ViewModel object.

    Anyway, you just have to loop through the IEnumerable and add each item to a new SelectList object and return it.

    public static List<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, string> text, Func<T, string> value, string defaultOption) 
    { 
        var items = enumerable.Select(f => new SelectListItem() { Text = text(f), Value = value(f) }).ToList(); 
        items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" }); 
        return items; 
    } 
    

    How to refactor these 2 similar methods into one?