使用自定义属性映射属性

时间:2014-02-02 05:06:33

标签: c# automapper

我想在每个实体中映射具有不同属性名称的两个实体。我正在将ViewModel实体映射到实体框架实体。是否有任何开箱即用的功能可以为我的viewmodel实体proerties添加一些自定义属性,而不是对具有不同属性名称的属性进行一对一映射?请在下面找到示例......

public class FooModel
{
    [customAttribute("FooId")]
    public int Id{ get; set; }
    [customAttribute("FooName")]
    public string Name{ get; set; }
}

public class Foo
{
    public int FooId{ get; set; }
    public string FooName{ get; set; }
}

我想在Foo类上映射具有实际属性名称的customattribute名称。我不想明确地映射,因为我的应用程序中有很多类。

我正在使用以下扩展方法,但我不知道如何在MapFrom

中动态映射目标属性
public static IMappingExpression<TSource, TDestination> CustomMapper<TSource, TDestination>
    (this IMappingExpression<TSource, TDestination> expression)
{
    var flags = BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance;
    var sourceType = typeof(TSource);
    var destinationProperties = typeof(TDestination).GetProperties(flags);

    foreach (var property in destinationProperties)
    {
        var props = sourceType.GetProperties();
       // props.Select(s=>s.GetCustomAttributes(typeof(PropertyMapper)).Single(m=>m.)
        foreach (var prop in props)
        {
            var attributes = Attribute.GetCustomAttributes(prop);
            if (attributes.Count() == 1 && ((PropertyMapper)attributes[0]).Name == property.Name)
            {
         //  expression.ForMember(property.Name,s=>s.MapFrom<TDestination>(t=>t.));
            }

        }

        if (sourceType.GetProperty(property.Name, flags) == null)
        {

            expression.ForMember(property.Name, opt => opt.Ignore());
        }
    }
    return expression;
}

1 个答案:

答案 0 :(得分:0)

在视图模型中使用属性可能会使您的视图在模型绑定时出错,因为您希望通过创建通用属性来处理此问题,当您希望将模式转换为查看模型时,您想要做什么?你想在你的模型中使用相同的属性吗?尝试使您的域模型POCO。 如果你注意到,在这种情况下你通过在模型和视图模型中使用属性使你的代码变得有点复杂,哼哼?最好有一个网关来处理这个问题,最好的地方是mappers的扩展方法,例如我有这个模型和viewmodel:

  public class Blog
    {
        public Guid Id { get; set; }
        public string Title { get; set; }
    }


    public class BlogViewModel
    {

        public Guid PostId { get; set; }

        public string Title { get; set; }
    }

  public static class BlogMapper
    {
   public static IEnumerable<BlogViewModel> ConvertToPostListViewModel(this IEnumerable<Blog> posts)
        {
            Mapper.CreateMap<Blog, BlogViewModel>()
                .ForMember(blo => blo.PostId, bl => bl.MapFrom(b => b.Id));
            return Mapper.Map<IEnumerable<Blog>, IEnumerable<BlogViewModel>>(posts);
        }
    }
顺便说一下,在某些情况下,映射和对象到另一个在这个例子中并不简单,我认为不可能通过属性处理它们,并且使每个case属性类成为几个可以使代码肮脏,难以阅读。模型和ViewModel应该对每个其他成员一无所知,也可以执行有关映射成员的任务。(SOLID原则)