将lambda表达式作为参数传递给方法?

这似乎是一个常见的要求,但我无法在任何地方找到解决方案。

我有一个方法,它将根据传递给它的参数OrderBy集合。

我想将’OrderBy’的内容传递给方法,但无法解决如何做到这一点。

我试过的

我已经尝试了一个带字符串的开关(例如,如果你传递’姓名’,它会点击按名称命名它的case ),但这感觉’hacky’和不必要。

我知道它就像Func ,但我无法破解它。

PSEUDO代码:

 GetOrderedCollection([NOT SURE] orderBy) { return collection.OrderBy(orderBy); } 

OrderBy是具有以下签名的扩展方法:

 public static IOrderedEnumerable OrderBy( this IEnumerable source, Func keySelector ) 

(来源: https : //msdn.microsoft.com/it-it/library/bb534966%28v=vs.110%29.aspx )

所以你的方法需要一个Func作为参数,其中TSource是List类型,TKey是lambda返回的类型。 一个例子是:

 public void Method(List list, Func func) { ... IOrderedEnumerable orderedEnumerable = list.OrderBy(func); } 

编辑:我还注意到,在您的示例代码中,您将方法声明为void,然后您尝试返回IOrderedEnumerable。 如果你想要获得有序的集合,你的方法需要至少有一个IEnumerable类型(但这会破坏它的排序目的,因为IEnumerables不保证顺序。更可能的实现是返回List并调用list.OrderBy(func).ToList()

在它最通用的forms中,您的方法需要看起来像:

 IOrderedEnumerable GetOrderedCollection(IEnumerable collection, Func orderBy) { return collection.OrderBy(orderBy); } 

T1是列表中项目的类型, T2是您要订购的T1属性的类型。

这满足您的要求吗?

  static void Main(string[] args) { var objects = new List(); GetOrderedCollection(objects, x => x.Name); } class Test { public string Name { get; set; } } static IEnumerable GetOrderedCollection(IEnumerable objects, Func orderBy) { return objects.OrderBy(orderBy); } 

是的,你正在寻找一个Func orderingFunc 。 重要的是输出( TResult )是一个IComparable因此OrderBy函数可以正确地对结果进行排序。

所以这样的事情会很好:

 public void OrderByDynamic(Func orderByFunc) { collection = collection.OrderBy(orderByFunc); //don't forget to assign the return value } 

您可以像普通的lambda函数一样调用它:

 OrderByDynamic(m => m.SortObj); //as long as this property/return value is IComparable 

一个.NET小提琴演示了这个想法

参数必须是FuncAction 。 有关详细信息,请参阅此问题的答案。