Expression.Lamda是否已知类型?

时间:2017-01-11 21:15:48

标签: c#

我有一个我们使用的Generic Sort方法,需要扩展它以便能够对不同类型的列表进行排序。

当我传入一个列表时,构建sortExpression的代码不会起作用,因为列表项是继承的,因此父类型反映在T中,而不是传递给o的实际类型。

任何想法如何使用传递的类型工作?

public static List<T> Sort<T>(IQueryable<T> list, int sortOrder, string sortColumn, Type o)
{            
    var param = Expression.Parameter(o);
    MemberExpression sortProperty = Expression.Property(param, sortColumn);
    String propertyType = o.GetProperty(sortColumn).PropertyType.ToString();
    switch (propertyType)
    {
        case "System.String":
            {
                var sortExpression = Expression.Lambda<Func<T, String>>(sortProperty, param);
                return sortOrder == 0 ? list.OrderBy(sortExpression).ToList() : list.OrderByDescending(sortExpression).ToList();
            }
        case "System.Int32":
            {
                var sortExpression = Expression.Lambda<Func<T, Int32>>(sortProperty, param);
                return sortOrder == 0 ? list.OrderBy(sortExpression).ToList() : list.OrderByDescending(sortExpression).ToList();
            }
        case "System.Decimal":
            {
                var sortExpression = Expression.Lambda<Func<T, Decimal>>(sortProperty, param);
                return sortOrder == 0 ? list.OrderBy(sortExpression).ToList() : list.OrderByDescending(sortExpression).ToList();
            }
     //  etc...
    }
}

2 个答案:

答案 0 :(得分:1)

如有必要,您可以使用Expression.Convert(),并且可以使用list.ElementType获取IQueryable中元素的类型。

例如:

public static List<T> Sort<T>(IQueryable<T> list, int sortOrder, string sortColumn, Type o)
{            
    var param = Expression.Parameter(list.ElementType);
    MemberExpression sortProperty = Expression.Property(Expression.Convert(param, o), sortColumn);
     //  etc...

答案 1 :(得分:0)

尝试将PropertyType作为Expression.Lambda()

中的第一个参数发送