动态反射

        /// <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

{

 
}

posted @ 2019-11-28 16:00  芮源  阅读(241)  评论(0编辑  收藏  举报