如何映射名为Unit的c#类,该类又有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; }
}
将上面的单位映射到此viewmodel:
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; }
}
答案 0 :(得分: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>();
}
}
}
<强> MappingTests.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"));
}
}
}