Я использую automapper, чтобы отобразить часть моей игры в файл XML, чтобы я мог ее экспортировать:
cfg.CreateMap () .ForMember (d => d.RoomType, opt =>opt.MapFrom (src => src.GetRoomType ()))
По какой-то причине, которую я не могу понять, он добавляет родительский элемент в XML следующим образом:
<RoomType>
<RoomType monster="Random">X_Y001</RoomType>
<RoomType monster="Random">X_Y003</RoomType>
<RoomType monster="Random">X_Y005</RoomType>
</RoomType>
Я не хочу, чтобы структура XML выглядела так, я просто хочу, чтобы элементы были такими:
<RoomType monster="Random">X_Y001</RoomType>
<RoomType monster="Random">X_Y003</RoomType>
<RoomType monster="Random">X_Y005</RoomType>
Вот метод GetRoomType:
public static IEnumerable<RoomType> GetRoomType(this DungeonRoom room)
{
var customType = room.Monsters
.Where(e => e.Treasure.Category.IsActive);
if (room.RoomType?.MonsterType == null) yield break;
if (room.RoomType.MonsterType.StartsWith("X_Y"))
{
yield return new RoomType(room.RoomType.MonsterType);
}
foreach (PageTreasure pe in customType)
{
if (customType == null) yield break;
if (RoomLookupByTypeId.ContainsKey(pe.Treasure.Id))
yield return RoomLookupByTypeId[pe.Treasure.Id];
}
}
}
А вот RoomLookupByTypeId() метод:
public static readonly IDictionary<Int32, RoomType> RoomLookupByTypeId =
new Dictionary<Int32, RoomType> {
{373, new RoomType("X_Y001")},
{488, new RoomType("X_Y002")},
{467, new RoomType("X_Y003")},
{238, new RoomType("X_Y004")},
{756, new RoomType("X_Y005")}
};
А вот класс, который отображается в XML:
public class RoomType
{
[XmlText]
public String TypeId { get; set; }
[XmlAttribute("monster")]
public String Monster
{
get { return "Random"; }
set { throw new NotSupportedException("Computed property, setter only exists for XmlSerializer"); }
}
public RoomType() { }
public RoomType(String Id)
{
TypeId = Id;
}
}
И это пример результата:
<RoomType>
<RoomType monster="Random">X_Y001</RoomType>
<RoomType monster="Random">X_Y003</RoomType>
<RoomType monster="Random">X_Y005</RoomType>
</RoomType>
Таким образом, данные верны, но это добавляет то открытие и закрытие <RoomType>
, в котором оно не нуждается.
Я не уверен, почему это делает.
Сначала я подумалэто было из-за того, что GetRoomType () возвращал что-то отличное от 'null', но я добавил 'yield break', чтобы он не возвращал что-либо, если найдет ноль.
Так что я в растерянности. Я понятия не имею, почему он это делает.
Кто-нибудь видит что-нибудь, что может быть причиной этого?
Спасибо!