92 lines
3.0 KiB
C#
92 lines
3.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Dynamic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using AutoMapper;
|
|
|
|
namespace Server.Utils
|
|
{
|
|
/// <summary>
|
|
/// 动态属性
|
|
/// </summary>
|
|
/// <typeparam name="T"></typeparam>
|
|
/// <typeparam name="TDestination"></typeparam>
|
|
public class DynamicCustomResolver<TSource, TDestination, TMember> : IValueResolver<TSource, TDestination, TMember>
|
|
{
|
|
public DynamicCustomResolver(string name, Func<object, TMember> resolverValueFunc)
|
|
{
|
|
Name = name;
|
|
this.MemberType = typeof(TDestination).GetProperty(name).PropertyType;
|
|
this.ResolverValueFunc = resolverValueFunc;
|
|
}
|
|
/// <summary>
|
|
/// 属性的名称
|
|
/// </summary>
|
|
public string Name { get; set; }
|
|
/// <summary>
|
|
/// 成员类型
|
|
/// </summary>
|
|
public Type MemberType { get; set; }
|
|
/// <summary>
|
|
/// 自定义转换值
|
|
/// </summary>
|
|
public Func<object, TMember> ResolverValueFunc { get; set; }
|
|
/// <summary>
|
|
/// 转换
|
|
/// </summary>
|
|
/// <param name="source"></param>
|
|
/// <param name="destination"></param>
|
|
/// <param name="destMember"></param>
|
|
/// <param name="context"></param>
|
|
/// <returns></returns>
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|