c# - 如何返回一个带有我事先不知道的通用参数的函数?

标签 c# generics closures

我想调用一个生成函数的函数,但是我不知道类型参数,直到我像这样调用生成的函数:

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);
  }
}

在调用返回的函数之前,我不会知道 T 的类型。我想象这样的东西来生成函数,它将列表包装在一个闭包中,这样我就不必一直传递它。

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;
}

更新:

我知道有更好的方法可以做到这一点。我想知道如何将此列表包装在一个闭包中并返回一个具有我提前不知道的泛型类型的函数。例如,由于我无法在不知道类型的情况下返回泛​​型类型函数,是否有某种类型可以替换它?

最佳答案

诀窍是确定您关心的两种类型的共同点。在本例中,它是 IComparable。您正在排序,stringint 都是 IComparable

您还使问题变得比需要的复杂得多。您不需要那么多返回 FuncFunc。您可以简化。

此外,您也不希望 ASP.NET MVC 类渗透到整个应用程序中。将这些东西保留在 Controller 中,让执行实际工作的代码采用参数,这样它就不知道自己是在 ASP.NET MVC 中运行还是在 Web 中运行,并且可以进行单元测试。

    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);
    }

关于c# - 如何返回一个带有我事先不知道的通用参数的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5970869/

相关文章:

javascript - 调用本应更改的函数后属性值没有更改

C# 打印 for 循环

c# - JObject ToString 与 StringEnumConverter 不工作

c# - 将 List<SomeObject> 转换为 List<T>?

swift - 无法将协议(protocol)的通用关联类型的值转换为预期的参数类型

swift - 如何通过 swift 初始化一个值为 block 的 NSMapTable

c# - 当您有一个属性依赖于 Web 服务调用的类时,最佳设计实践是什么?

c# - 字典的匿名集合初始值设定项

swift - 从 Interface Builder 加载具有通用约束的 UIView 子类的解决方法?

javascript - 了解 JavaScript 中的闭包范围