using System; using System.Collections.Generic; using System.Dynamic; using System.Linq; using System.Text; using System.Threading.Tasks; using AutoMapper; namespace Server.Utils { /// /// 动态属性 /// /// /// public class DynamicCustomResolver : IValueResolver { public DynamicCustomResolver(string name, Func resolverValueFunc) { Name = name; this.MemberType = typeof(TDestination).GetProperty(name).PropertyType; this.ResolverValueFunc = resolverValueFunc; } /// /// 属性的名称 /// public string Name { get; set; } /// /// 成员类型 /// public Type MemberType { get; set; } /// /// 自定义转换值 /// public Func ResolverValueFunc { get; set; } /// /// 转换 /// /// /// /// /// /// public TMember Resolve(TSource source, TDestination destination, TMember destMember, ResolutionContext context) { try { var dny = source as ExpandoObject; var item = dny.FirstOrDefault(w => w.Key == Name); var val = item.Value; //如果自定义了转换器,就调用 if (ResolverValueFunc != null) { return ResolverValueFunc(val); } if (item.Value == DBNull.Value) { val = null; } if (this.MemberType.IsEnum)//枚举 { if (val == null) { return (TMember)Enum.ToObject(this.MemberType, 0); } return (TMember)Enum.ToObject(this.MemberType, val); } if (this.MemberType == typeof(string)) { if (val == null) { return default(TMember); } return (TMember)Convert.ChangeType(val, this.MemberType); } if (this.MemberType.IsValueType) { if (val == null) { return default(TMember); } } return (TMember)Convert.ChangeType(val, this.MemberType); } catch (Exception e) { throw new Exception(this.Name + "转换错误 " + source, e); } } } }