簡體   English   中英

已知類型的Expression.Lamda?

[英]Expression.Lamda with known type?

我有一個通用排序方法,我們需要對其進行擴展以能夠對不同類型的列表進行排序。

當我傳遞一個列表時,構建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...
    }
}

如有必要,可以使用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...

嘗試將PropertyType作為Expression.Lambda()中的第一個參數發送

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM