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);
}
}
}
}