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

标签 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);
}   

最佳答案

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

相反,您可以传递一个表达式(就像代码即数据)并解析它以获取属性名称,如下所示:

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
    //...
}   

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

关于c# - 如何检查KeySelector中的属性名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35178581/

相关文章:

c# - 在 LINQ to SQL 中创建按位运算符?

c++ - 您如何构建示例 CUDA Thrust 设备排序?

jQuery 根据值对 div 内的复选框进行排序

c# - 绑定(bind)自定义类中的键

c# - 使用 Linq 对 Gridview 进行分页

c# - 如何安全地统计 session : is Session_Start/End in Global. Asax安全/足够安全?

c# - 完成 IQueryable 通用列表排序的更好方法?

python - 如何在 Python 中正确排序对象列表

c# - 从 Windows 类库引用 .NET Standard 库

c# - 可恢复文件下载问题 -> 当文件大小超过 Int32.MaxValue(2GB)(大文件)时