动态生成具有嵌套属性的linq选择(select)

本文介绍了一种使用C#表达式树将SelectList对象转换为SelectListDto对象的方法。通过反射获取源对象属性,并创建表达式树来绑定目标对象属性,实现类型之间的映射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    class SelectItem
    {
        public string Item { get; set; }
    }
    class SelectList
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public SelectItem Item { get; set; }
    }
    class SelectListDto : SelectList
    {

    }


        static Func<SelectList, SelectListDto> Test()
        {
            var entityType = typeof(SelectList);
            var selectListDtoType = typeof(SelectListDto);
            var selectItemType = typeof(SelectItem);
            var entityIDProperty = entityType.GetProperty("ID");
            var entityNameProperty = entityType.GetProperty("Name");
            var entityItemProperty = entityType.GetProperty("Item");
            var entityItemItemProperty = entityItemProperty.PropertyType.GetProperty("Item");
            var selectListDtoIDProperty = selectListDtoType.GetProperty("ID");
            var selectListDtoNameProperty = selectListDtoType.GetProperty("Name");
            var selectListDtoItemProperty = selectListDtoType.GetProperty("Item");
            var selectListDtoItemItemProperty = selectListDtoItemProperty.PropertyType.GetProperty("Item");

            var parameterExpression = Expression.Parameter(entityType);
            var newInstantiationExpression = Expression.New(selectListDtoType);

            var idMemberExpression = Expression.Property(parameterExpression, entityIDProperty);
            var nameMemberExpression = Expression.Property(parameterExpression, entityNameProperty);
            var itemMemberExpression = Expression.Property(parameterExpression, entityItemProperty);

            var innerObjNew = Expression.New(selectItemType);

            var nestedItemMemberExpression = Expression.Property(itemMemberExpression, entityItemItemProperty);

            var idBinding = Expression.Bind(selectListDtoIDProperty, idMemberExpression);
            var nameBinding = Expression.Bind(selectListDtoNameProperty, nameMemberExpression);
            var nestedItemBinding = Expression.Bind(entityItemItemProperty, nestedItemMemberExpression);

            var nestedInit = Expression.MemberInit(innerObjNew, nestedItemBinding);

            var nestedBinding = Expression.Bind(entityItemProperty, nestedInit);
            var bindings = new List<MemberAssignment>() { idBinding, nameBinding, nestedBinding};

            var memberInitExpression = Expression.MemberInit(newInstantiationExpression, bindings);

            var lambda = Expression.Lambda<Func<SelectList, SelectListDto>>(memberInitExpression, parameterExpression);
            return lambda.Compile();
        }

  

参考地址:

https://stackoverflow.com/a/51764873

https://stackoverflow.com/a/31465017/7712266

https://docs.microsoft.com/zh-cn/dotnet/csharp/expression-trees

转载于:https://www.cnblogs.com/myesn/p/10267915.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值