获取内部对象的属性 [英] get property of inner object

查看:126
本文介绍了获取内部对象的属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  public static IQueryable< T>如果(!string.IsNullOrWhiteSpace(SortField))
{
var param = Expression 。参数(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;
}
}


解决方案

你需要将属性路径传递给函数(如User.Email),并在其中记录该内容,如此

  public静态IQueryable< T> OrderByField< T>(此IQueryable< T>源,字符串sortField,bool升序)
{
if(string.IsNullOrWhiteSpace(sortField))返回源;
var item = Expression.Parameter(typeof(T),item);
表达式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);

  
表达式member = null;
foreach(var memberName in sortField.Split('。'))
member = Expression.PropertyOrField(member ?? item,memberName);

从表达式参数开始,并为路径中指定的每个成员构建一个访问器。 >

Hi I am trying to use that code to get property User.Email of customer that contains User. but its an object (User of type User) so it throws exception. what should i fix?

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

解决方案

You need to pass a property path to the function (like "User.Email") and account for that inside, like this

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);
}

The essential part is

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

which starts from the expression parameter and builds an accessor for each member specified in the path.

这篇关于获取内部对象的属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆