C# 获取内部对象的属性

C# 获取内部对象的属性,c#,tree,expression,C#,Tree,Expression,您好,我正在尝试使用该代码获取包含用户的客户的属性User.Email。但它是一个对象(User类型的用户),所以它抛出异常。我该修什么 public static IQueryable<T> OrderByField<T>(this IQueryable<T> q, string SortField, bool Ascending) { if (!string.IsNullOrWhiteSpace(SortField))

您好,我正在尝试使用该代码获取包含用户的客户的属性User.Email。但它是一个对象(User类型的用户),所以它抛出异常。我该修什么

public static IQueryable<T> OrderByField<T>(this IQueryable<T> q, string SortField, bool Ascending)
    {
        if (!string.IsNullOrWhiteSpace(SortField))
        {
            var param = Expression.Parameter(typeof (T), "p");
            var prop = Expression.Property(param, SortField);
            var exp = Expression.Lambda(prop, param);
            string method = Ascending ? "OrderBy" : "OrderByDescending";
            Type[] types = new Type[] {q.ElementType, exp.Body.Type};
            var mce = Expression.Call(typeof (Queryable), method, types, q.Expression, exp);
            return q.Provider.CreateQuery<T>(mce);
        }
        else
        {
            return q;
        }
    }
公共静态IQueryable OrderByField(此IQueryable q,字符串SortField,bool升序)
{
如果(!string.IsNullOrWhiteSpace(SortField))
{
var param=表达式参数(类型(T),“p”);
var prop=Expression.Property(param,SortField);
var exp=表达式Lambda(prop,param);
string方法=升序?“OrderBy”:“OrderByDescending”;
类型[]类型=新类型[]{q.ElementType,exp.Body.Type};
var mce=Expression.Call(typeof(Queryable)、方法、类型、q.Expression、exp);
返回q.Provider.CreateQuery(mce);
}
其他的
{
返回q;
}
}

您需要向函数传递一个属性路径(如“User.Email”),并在内部对其进行说明,如下所示

public static IQueryable<T> OrderByField<T>(this IQueryable<T> source, string sortField, bool ascending)
{
    if (string.IsNullOrWhiteSpace(sortField)) return source;
    var item = Expression.Parameter(typeof(T), "item");
    Expression member = null;
    foreach (var memberName in sortField.Split('.'))
        member = Expression.PropertyOrField(member ?? item, memberName);
    var selector = Expression.Lambda(member, item);
    var method = ascending ? "OrderBy" : "OrderByDescending";
    var types = new [] { source.ElementType, selector.Body.Type };
    var expression = Expression.Call(typeof(Queryable), method, types, source.Expression, selector);
    return source.Provider.CreateQuery<T>(expression);
}
它从表达式参数开始,并为路径中指定的每个成员构建访问器

    var item = Expression.Parameter(typeof(T), "item");
    Expression member = null;
    foreach (var memberName in sortField.Split('.'))
        member = Expression.PropertyOrField(member ?? item, memberName);