• 动态反射


            /// <summary>
            /// 创建lambda表达式:p=>p.propertyName == propertyValue
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="column"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public static Expression<Func<T, bool>> CreateEqual<T>(string propertyName, string propertyValue)
            {
                ParameterExpression parameter = Expression.Parameter(typeof(T), propertyName);//创建参数p
                MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
                ConstantExpression constant = Expression.Constant(propertyValue);//创建常数
                return Expression.Lambda<Func<T, bool>>(Expression.Equal(member, constant), parameter);
            }
           
    
            /// <summary>
            /// 泛型+反射
            /// </summary>
            /// <typeparam name="TOut">传出</typeparam>
            /// <typeparam name="TIn">传入</typeparam>
            /// <typeparam name="TM">包含类型</typeparam>
            /// <typeparam name="name">在传入类中的字段</typeparam>
            /// <typeparam name="id">包含类的关联字段</typeparam>
            /// <typeparam name="exp">条件</typeparam>      
            /// <param name="objIn"></param>
            /// <returns></returns>
            public TOut TypeContent<TOut, TIn>(TIn objIn,string name, string id)
            {            
                Type tOut = typeof(TOut);
                Type tIn = typeof(TIn);
                Type ttm = typeof(TM);
                TOut outModel = Activator.CreateInstance<TOut>();           
                // 属性赋值
                foreach (var prop in tOut.GetProperties())
                {
                    var propInfo = tIn.GetProperty(prop.Name);
                    if (propInfo != null)
                    {
                        var inValue = propInfo.GetValue(objIn);
                        if (propInfo.Name == name)
                        {                       
                            var tmInfo = ttm.GetProperty(id);
                            var dbSet = Context.Set<TM>().AsNoTracking().AsQueryable();
                            var muc = dbSet.FirstOrDefault(CreateEqual<TM>(id, inValue.ToString()));
                            if (muc == null)
                            {
                                prop.SetValue(outModel, new Musics());
                            }
                            else
                            {
                                prop.SetValue(outModel, muc);
    
                            }
                        }
                        else
                        {                       
                            prop.SetValue(outModel, inValue);
                        }
                    }
                }
                // 字段赋值
                foreach (var field in tOut.GetFields())
                {
                    var fieldInfo = tIn.GetField(field.Name);
                    if (fieldInfo != null)
                    {
                        var inValue = fieldInfo.GetValue(objIn);
                        field.SetValue(outModel, inValue);
                    }
                }
                
                return outModel;
            }

    传入A对象、A的外键、B的主键

    适用于:

    class A

    {

      B b{get;set;}
    }

    class B

    {

     
    }

  • 相关阅读:
    高级前端工程师面试必备(持续更新中)
    用node编写cli工具
    用vscode开发vue应用
    jsbridge的js封装
    react-create-app 构建react项目的流程以及需要注意的地方
    【面试篇】寒冬求职季之你必须要懂的原生JS(中)
    基于vue-cli3.0构建功能完善的移动端架子,主要功能包括
    @vue/cl构建得项目下,postcss.config.js配置,将px转化成rem
    eslint prettier editrorconfig
    数据结构题集--集锦
  • 原文地址:https://www.cnblogs.com/ruiyuan/p/11950619.html
Copyright © 2020-2023  润新知