![](/img/trans.png)
[英]Passing lambda expression as a method parameter with FluentValidation
[英]Passing a lambda expression as parameter to a method?
这似乎是一个常见的要求,但我无法在任何地方找到解决方案。
我有一个方法, OrderBy
集合取决于传递给它的参数。
我想将'OrderBy'的内容传递给方法,但无法解决该方法的问题。
我试过的
我已经尝试过一个带有字符串的开关(例如,如果你传递'姓名',它会点击按名称命名它的case
),但这感觉'hacky'和不必要。
我知道它就像Func<TEntity, TResult>
,但我无法破解它。
PSEUDO代码:
GetOrderedCollection([NOT SURE] orderBy)
{
return collection.OrderBy(orderBy);
}
OrderBy是具有以下签名的扩展方法:
public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector
)
(来源: https : //msdn.microsoft.com/it-it/library/bb534966%28v=vs.110%29.aspx )
所以你的方法需要一个Func作为它的参数,其中TSource是List类型,TKey是你的lambda返回的类型。 一个例子是:
public void Method<TSource, TKey>(List<TSource> list, Func<TSource, TKey> func)
{
...
IOrderedEnumerable<TSource> orderedEnumerable = list.OrderBy(func);
}
编辑:我还注意到,在您的示例代码中,您将方法声明为void,然后您尝试返回IOrderedEnumerable。 如果你想要获得有序的集合,你的方法需要至少有一个IEnumerable类型(但是这会破坏它的排序目的,因为IEnumerables不保证顺序。更可能的实现是返回List<TSource>
并调用list.OrderBy(func).ToList()
在它最通用的形式中,您的方法需要如下所示:
IOrderedEnumerable<T1> GetOrderedCollection<T1, T2>(IEnumerable<T1> collection, Func<T1, T2> orderBy)
{
return collection.OrderBy(orderBy);
}
T1
是列表中项目的类型, T2
是您要订购的T1
属性的类型。
这满足您的要求吗?
static void Main(string[] args) {
var objects = new List<Test>();
GetOrderedCollection(objects, x => x.Name);
}
class Test {
public string Name { get; set; }
}
static IEnumerable<TEntity> GetOrderedCollection<TEntity>(IEnumerable<TEntity> objects, Func<TEntity, object> orderBy) {
return objects.OrderBy(orderBy);
}
是的,你正在寻找一个Func<TEntity, TResult> orderingFunc
。 重要的是输出( TResult
)是一个IComparable
因此OrderBy
函数可以正确地对结果进行排序。
所以这样的事情会很好:
public void OrderByDynamic(Func<Model, object> 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小提琴演示了这个想法
参数必须是Func
或Action
。 有关详细信息,请参阅此问题的答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.