如何检查KeySelector中的属性名称?

时间:2016-02-03 13:35:14

标签: c# linq sorting

如何检查KeySelector中的财产?

我有按选择的列名排序集合的功能:

private void DoListSort<T,TKey>(SortableObservableCollection<T> listBoxItems, Func<T, TKey> keySelector)
{
    listBoxItems.Sort(keySelector,ListSortDirection.Ascending);
}

我想:

private void DoListSort<T,TKey>(SortableObservableCollection<T> listBoxItems, Func<T, TKey> keySelector)
{
    if ( keySelector.PropertyIAmAskingFor == ActualOrderByColumnName )
        listBoxItems.Sort(keySelector, ListSortDirection.Descending);
    else
        listBoxItems.Sort(keySelector,ListSortDirection.Ascending);
}   

2 个答案:

答案 0 :(得分:0)

keySelector是一个返回T类型的函数,并且作为参数类型TKey获取,因此它没有任何属性。

答案 1 :(得分:0)

您可以将Func视为已编译的方法。即使这个Func是通过lambda表达式创建的,也无法访问这样的表达式。

相反,您可以传递Expression(类似于代码作为数据)并解析它以获取如下属性名称:

private void DoListSort<T,TKey>(
    SortableObservableCollection<T> listBoxItems,
    Expression<Func<T, TKey>> keySelectorExpression)
{
    MemberExpression member_expression =
        (MemberExpression)keySelector.Body;

    //This is the name of the property
    var property_name = member_expression.Member.Name;

    Func<T, TKey> keySelector = keySelectorExpression.Compile();

    //Continue here
    //...
}   

请注意,如果传递的表达式不是简单的成员访问表达式,则此方法将引发异常。