CreateMap <t,u>表示Nullable <tmember>到TMember

时间:2018-01-06 04:12:44

标签: c# automapper

假设我有一个内部EF模型:

public class EFModel
{
    public int key { get; set; }
    public string Name { get; set; }
    public int? OptionalId { get; set;}
}

我的外部模型具有相同的数据类型,除了没有Nullable:

public class Extmodel
{
    public int key { get; set; }
    public string Name { get; set; }
    public int OptionalId { get; set; }
}

一般情况下,我必须通过CreateMap并明确施放:

CreateMap<EfModel,ExtModel>
    .ForMember(a => a.OptionalId, b => b.MapFrom(c => (int)c.OptionalId))
    .ReverseMap();

但是想象一下拥有一个非常大的数据库,应该有一些方法可以加快速度。我尝试了一个可以在System.Reflection&#39;上工作的辅助函数。和泛型来解决这个问题。

    public void MapWrap<T, U>() where T : new()
    {
        var newT = new T();
        var map = CreateMap<T, U>();

        foreach (var member in newT.GetType().GetProperties())
        {
            Type memberType = member.PropertyType;

            var nullable = Nullable.GetUnderlyingType(memberType) == null;
            var notString = memberType != typeof(string);

            if (nullable && notString)
            {
                map.ForMember(dest => dest.GetType().GetMethod(member.Name),
                    src => src.MapFrom(
                        dt => Convert.ChangeType(dt.GetType().GetMethod(member.Name), Nullable.GetUnderlyingType(memberType))));
            }
        }
        map.ReverseMap();
    }

假设:

  1. 所有内部和外部名称相同
  2. 所有铸件都严格为Nullable to T
  3. 我收到错误&#39;会员的自定义配置仅支持某个类型的顶级个人会员。&#39;我觉得这一切都错了吗?

0 个答案:

没有答案