1

如何映射名为 Unit 的 ac# 类,该类又具有List<Unit>.

具体场景是一个 rootUnit 对象,其中包含一个作为第一级子级的 List。

第一级子单元对象将不包含任何其他单元,因此层次结构中不会有递归。

public class Unit
    {
        public Unit()
        {
            // Explicitly set the default value for the first unit in a hierarchy
            HierarchyIndex = 0;
            Units = new List<Unit>();
        }

        public List<Unit> Units { get; set; }

        public int UnitId { get; set; }
        public string Name { get; set; }       
        public Nullable<int> ParentId { get; set; }
        public int TemplateId { get; set; }       
        public bool HasChildren { get; set; }
        public bool IsFolder { get; set; }
        public DateTime CreatedAt { get; set; }
        public int HierarchyIndex { get; set; }
    }

将上面的单元映射到这个视图模型:

public class UnitTreeViewModel
{
    [JsonProperty("key")]
    public int UnitId { get; set; }
    [JsonProperty("title")]
    public string Name { get; set; }
    [JsonProperty("isLazy")]
    public bool HasChildren { get; set; } 
    [JsonProperty("isFolder")]
    public bool IsFolder { get; set; } 
}
4

1 回答 1

2

假设上面评论中我的问题的答案是肯定的,那么您需要多次应用映射 - 类似于这个问题:AutoMapper and flattening nested arrays

像这样的东西可能会起作用:

AutoMapperConfigurator.cs

namespace StackOverflow.ListUnit
{
    using AutoMapper;

    public class MyProfile : Profile
    {
        public override string ProfileName
        {
            get
            {
                return "MyProfile";
            }
        }

        protected override void Configure()
        {
            Mapper.CreateMap<Unit, UnitTreeViewModel>();
        }
    }
}

映射测试.cs

namespace StackOverflow.ListUnit
{
    using System.Collections.Generic;
    using System.Linq;

    using AutoMapper;

    using NUnit.Framework;

    [TestFixture]
    public class MappingTests
    {
        [Test]
        public void AutoMapper_Configuration_IsValid()
        {
            Mapper.Initialize(m => m.AddProfile<MyProfile>());
            Mapper.AssertConfigurationIsValid();
        }

        [Test]
        public void AutoMapper_Mapping_IsValid()
        {
            Mapper.Initialize(m => m.AddProfile<MyProfile>());
            Mapper.AssertConfigurationIsValid();

            var unit = new Unit
                {
                    UnitId = 123,
                    Name = "Stack Overflow Rocks",
                    HasChildren = true,
                    IsFolder = true,
                    Units =
                        new List<Unit>
                            {
                                new Unit
                                    {
                                        UnitId = 123123,
                                        Name = "I'm the first baby",
                                        HasChildren = false,
                                        IsFolder = false,
                                    },
                                new Unit
                                    {
                                        UnitId = 123321,
                                        Name = "I'm the second baby",
                                        HasChildren = false,
                                        IsFolder = false,
                                    }
                            }
                };

            var unitViewModels = new List<UnitTreeViewModel>
                {
                    Mapper.Map<Unit, UnitTreeViewModel>(unit)
                };
            unitViewModels.AddRange(
                unit.Units.Select(Mapper.Map<Unit, UnitTreeViewModel>));

            Assert.That(unitViewModels, Is.Not.Null);
            Assert.That(unitViewModels.Count(), Is.EqualTo(3));
            var unitViewModel = unitViewModels.First(x => x.UnitId == 123);
            Assert.That(unitViewModel, Is.Not.Null);
            Assert.That(unitViewModel.Name, Is.EqualTo("Stack Overflow Rocks"));
            unitViewModel = unitViewModels.First(x => x.UnitId == 123123);
            Assert.That(unitViewModel, Is.Not.Null);
            Assert.That(unitViewModel.Name, Is.EqualTo("I'm the first baby"));
            unitViewModel = unitViewModels.First(x => x.UnitId == 123321);
            Assert.That(unitViewModel, Is.Not.Null);
            Assert.That(unitViewModel.Name, Is.EqualTo("I'm the second baby"));
        }
    }
}
于 2012-11-25T22:35:57.477 回答