简体   繁体   English

已知类型的Expression.Lamda?

[英]Expression.Lamda with known type?

I have a Generic Sort method we use and need to extend it to be able to sort lists of different types. 我有一个通用排序方法,我们需要对其进行扩展以能够对不同类型的列表进行排序。

When I pass in one list, the code to build the sortExpression won't work because the list items are inherited and thus the parent type is reflected in T vs. the real type which is passed in o. 当我传递一个列表时,构建sortExpression的代码将无法工作,因为列表项是继承的,因此父类型反映在T中,而实类型则反映在o中。

Any ideas how I can make this work with the passed type? 有什么想法可以使传递的类型起作用吗?

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

You can use Expression.Convert() if necessary, and you can use list.ElementType to get the type of the elements in the IQueryable. 如有必要,可以使用Expression.Convert() ,还可以使用list.ElementType获取IQueryable中元素的类型。

For example: 例如:

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

尝试将PropertyType作为Expression.Lambda()中的第一个参数发送

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM