How can I return a function with common parameters that I do not know in advance?

I want to call a function that generates a function, but I don't know the type parameter until I call the generated function as follows:

ActionResult Foo() {
  IEnumerable<MyObject> list = GetList();

  var orderBy = OrderBy(list); // <-- HOW DO I WRITE OR DO THIS;

  switch(Request.QueryString["sortBy"]) {
    case "Name":
      return orderBy<string>(o => o.Name); // <-- SO I CAN MAKE THIS CALL
    case "TrackingNumber":
      return orderBy<int>(o => o.TrackingNumber); // <-- AND THIS ONE
    default:
      return View(list);
  }
}

I will not know the type T until I call the returned function. I imagine something like this to generate a function, it completes the list in close, so I don't need to skip it.

Func<Func<MyObject,T>,ActionResult> OrderBy<T>(IEnumerable<MyObject> list) {
  Func<Func<MyObject,T>, ActionResult> f = orderBy => {
     return View(Request.QueryString["sortDir"] == "d"
        ? list.OrderBy<MyObject, T>(orderBy)
        : list.OrderByDescending<MyObject, T>(orderBy));
  };
  return f;
}

Update:

I know there are better ways to do this. I want to know how I can wrap this list in closure and return a function that has a generic type that I don’t know about in advance. For example, since I cannot return a function of a general type without knowing the type, is there any type that I can replace with it?

+3
source share
2

, , , . IComparable. , string int - IComparable.

, . Func, Func. .

, ASP.NET MVC . , , , , ASP.NET MVC , .

    public static IEnumerable<MyObject> GetSortedList(string sortBy, bool sortAscending)
    {
        IEnumerable<MyObject> list = GetList();

        Func<MyObject, IComparable> keySelector;

        switch (sortBy)
        {
            case "Name":
                keySelector = o => o.Name;
                break;

            case "TrackingNumber":
                keySelector = o => o.TracingNumber;
                break;

            default:
                return list;
        }

        return sortAscending
                   ? list.OrderBy(keySelector)
                   : list.OrderByDescending(keySelector);
    }
+2

:

ActionResult Foo() {
  IEnumerable<MyObject> list = GetList();

  switch(Request.QueryString["sortBy"]) {
    case "Name":
      return OrderBy(list, o => o.Name); // <-- SO I CAN MAKE THIS CALL
    case "TrackingNumber":
      return OrderBy(list, o => o.TrackingNumber); // <-- AND THIS ONE
    default:
      return View(list);
  }
}

ActionResult OrderBy<T>(IEnumerable<MyObject> list, Func<MyObject, T> orderBy) {
    return View(Request.QueryString["sortDir"] == "d"
        ? list.OrderBy<MyObject, T>(orderBy)
        : list.OrderByDescending<MyObject, T>(orderBy));
}
+1

All Articles