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