CloudBuilder/CloudBuilder.Core/Extensions/SortCondition.cs
owenchen 1c0c83af5f ow
2026-05-12 10:09:31 +08:00

85 lines
2.7 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace CloudBuilder.Core.Extensions
{
/// <summary>
/// 列表字段排序条件
/// </summary>
public class SortCondition
{
/// <summary>
/// 初始化一个<see cref="SortCondition"/>类型的新实例
/// </summary>
public SortCondition() : this(null)
{ }
/// <summary>
/// 构造一个指定字段名称的升序排序的排序条件
/// </summary>
/// <param name="sortField">字段名称</param>
public SortCondition(string sortField)
: this(sortField, ListSortDirection.Ascending)
{ }
/// <summary>
/// 构造一个排序字段名称和排序方式的排序条件
/// </summary>
/// <param name="sortField">字段名称</param>
/// <param name="listSortDirection">排序方式</param>
public SortCondition(string sortField, ListSortDirection listSortDirection)
{
SortField = sortField;
ListSortDirection = listSortDirection;
}
/// <summary>
/// 获取或设置 排序字段名称
/// </summary>
public string SortField { get; set; }
/// <summary>
/// 获取或设置 排序方向
/// </summary>
public ListSortDirection ListSortDirection { get; set; }
}
/// <summary>
/// 支持泛型的列表字段排序条件
/// </summary>
/// <typeparam name="T">列表元素类型</typeparam>
public class SortCondition<T> : SortCondition
{
/// <summary>
/// 使用排序字段 初始化一个<see cref="SortCondition"/>类型的新实例
/// </summary>
public SortCondition(Expression<Func<T, object>> keySelector)
: this(keySelector, ListSortDirection.Ascending)
{ }
/// <summary>
/// 使用排序字段与排序方式 初始化一个<see cref="SortCondition"/>类型的新实例
/// </summary>
public SortCondition(Expression<Func<T, object>> keySelector, ListSortDirection listSortDirection)
: base(GetPropertyName(keySelector), listSortDirection)
{ }
/// <summary>
/// 从泛型委托获取属性名
/// </summary>
private static string GetPropertyName(Expression<Func<T, object>> keySelector)
{
string param = keySelector.Parameters.First().Name;
string operand = ((dynamic)keySelector.Body).Operand.ToString();
operand = operand.Substring(param.Length + 1, operand.Length - param.Length - 1);
return operand;
}
}
}