【发布时间】:2016-01-17 14:54:07
【问题描述】:
通常在提供用户指定的排序顺序并使用 LINQ 进行排序时,我最终会遇到如下丑陋的场景:
public static IEnumerable<ConfirmationItemViewModel> SortAscending(IEnumerable<ConfirmationItemViewModel> confirmations, string sortProperty)
{
switch (sortProperty)
{
case "CreatedOn":
confirmations = confirmations.OrderBy(i => i.CreatedOn).ToList();
break;
case "PaymentId":
confirmations = confirmations.OrderBy(i => i.PaymentId).ToList();
break;
default:
confirmations = confirmations.OrderBy(i => i.PaymentId).ThenBy(i => i.CreatedOn).ToList();
break;
}
return confirmations;
}
OrderBy 方法采用Func<TSource, TKey> 类型的函数委托,我认为它用于从正在排序的集合中的每个项目中获取排序属性的值。我想编写一个采用属性名称而不是委托的方法,并返回一个返回属性值的委托,如果这能解释我的意思的话。
希望我尝试对其进行编码,但它不起作用,将解释更多。鉴于我对表达式和代表的理解有限,这是我能得到的最接近的:
public static Func<TObject, TKey> BuildKeySelector<TObject, TKey>(TObject source, string propertyName)
{
return obj =>
{
var prop = source.GetType().GetProperty(propertyName, typeof(TKey));
return (TKey) prop.GetValue(obj);
};
}
static void Main(string[] args)
{
// Sort a list of Person objects by their Name property.
var peeps = new List<Person>();
var rank = peeps.OrderBy(BuildKeySelector(<something>, "Name"));
}
【问题讨论】:
-
您遇到了什么错误?你在哪里调用 SortAscending?
-
你不需要
TObject object作为参数。 -
是的,谢谢,@YacoubMassad,我意识到虽然我在为使我的代码工作而苦苦挣扎,但现在我发现我寻求的方法是不必要的。我会在几分钟内删除这个问题,因为它是重复的。