yz_server/Server/Utils/DynamicCustomResolver.cs

92 lines
3.0 KiB
C#
Raw Normal View History

2022-04-16 07:48:12 +00:00
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);
}
}
}
}