我想调用一个生成函数的函数,但是我不知道类型参数,直到我像这样调用生成的函数:
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
。您正在排序,string
和 int
都是 IComparable
。
您还使问题变得比需要的复杂得多。您不需要那么多返回 Func
的 Func
。您可以简化。
此外,您也不希望 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/