Automapper to XML serialization, производящий нежелательные родительские элементы XML - PullRequest
0 голосов
/ 08 октября 2019

Я использую 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', чтобы он не возвращал что-либо, если найдет ноль.

Так что я в растерянности. Я понятия не имею, почему он это делает.

Кто-нибудь видит что-нибудь, что может быть причиной этого?

Спасибо!

...