Отображение списка объектов из родительского класса с помощью AutoMapper - PullRequest
1 голос
/ 03 января 2011

У меня есть следующие классы:

    public class TestClass
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }

    public class ParentSource
    {
        public int A { get; set; }
        public List<TestClass> LstSource { get; set; }
    }

    public class ChildSource : ParentSource
    {
        public int B { get; set; }
    }

    public class ParentDestination
    {
        public int A { get; set; }
        public List<TestClass> LstDestination { get; set; }
    }

    public class ChildDestination : ParentDestination
    {
        public int B { get; set; }
    }

Я пытаюсь сопоставить ChildSource с ChildDestination с помощью AutoMapper версии 1.1.0.188.

Mapper.Initialize(cfg =>
{  
       cfg.CreateMap<ParentSource, ParentDestination>()
       .Include<ChildSource, ChildDestination>()
       .ForMember(dest => dest.LstDestination, opt => opt.MapFrom(src => src.LstSource))            
       .ForMember(dest => dest.A, opt => opt.MapFrom(src => src.A));


    cfg.CreateMap<ChildSource, ChildDestination>() 
       .ForMember(dest => dest.B, opt => opt.MapFrom(src => src.B));
});

Затем я делаю тест:

ChildSource test = new ChildSource();
test.LstSource = new List<SourceTestClass>() { new SourceTestClass() { ID = 3, Name = "abc" }, new SourceTestClass() { ID = 11, Name = "xyz" } };
test.A = 100;
test.B = 200;

ChildDestination result = Mapper.Map<ChildSource, ChildDestination>(test);

Объект результат содержит правильные значения A и B, но LstSource равен null .Что я делаю не так?

1 Ответ

0 голосов
/ 29 июля 2011

Я ответил на этот вопрос здесь Наследование Automapper - повторное использование карт

... чик

Вы не можете сделать это, я не думаю - вам нужно составить сопоставления. На самом деле это может быть ошибкой, так как вики заявляют, что это возможно, однако приведенный пример просто полагается на имя свойств для сопоставления, а не на бит включения. По крайней мере, я так понимаю.

Если вы посмотрите на http://automapper.codeplex.com/wikipage?title=Lists%20and%20Arrays и измените имя свойств в Source и Dest (я делаю их Value 3 и Value4, чтобы действительно перемешать), то явно добавьте ваши отображения.

    Mapper.CreateMap<ChildSource, ChildDestination>()
            .ForMember( x => x.Value4, o => o.MapFrom( y => y.Value2 ) );
        Mapper.CreateMap<ParentSource, ParentDestination>()
            .Include<ChildSource, ChildDestination>()
            .ForMember( x => x.Value3, o => o.MapFrom( y => y.Value1 ) );

Тогда, похоже, не получится.

        ChildSource s = new ChildSource()
        {
            Value2 = 1,
            Value1 = 3
        };

        var c = s.MapTo<ChildDestination>();
        var c2 = s.MapTo<ParentDestination>();

        Assert.AreEqual( c.Value3, s.Value1 );
        Assert.AreEqual( c.Value4, s.Value2 );
        Assert.AreEqual( c2.Value3, s.Value1 );
        Assert.AreEqual( c.Value4, s.Value2 );

Другие заметки

Кроме того, Включить должен быть ребенок, а не родитель. Прототип фактически заявляет это

    public IMappingExpression<TSource, TDestination> Include<TOtherSource, TOtherDestination>()
        where TOtherSource : TSource
        where TOtherDestination : TDestination

Из того, что я прочитал, вы должны сначала создать свое дочернее отображение, хотя это могло быть старой проблемой.

Mapper.CreateMap<ChildSource, ChildDest>();

Тогда твой родитель

Mapper.CreateMap<ParentSource, Parent Dest>()
       .Include<ChildSource, ChildDest>();

Источник http://automapper.codeplex.com/wikipage?title=Lists%20and%20Arrays

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...