首页 > 解决方案 > 如果未找到结果,则从 IEnumerable 方法返回 NULL

问题描述

我正在使用 Automapper 和带有 Xml 序列化的类来生成 XML 文件。

在此方法中,它向 Automapper 返回一个 IEnumerable,然后 Automapper 会写出一系列<GenerationMethod>...</GenerationMethod>XML 元素。

它确实有效,但是,如果它返回一个空的 IEnumerable,因为没有找到结果,我会得到这样的空 XML 标记:

<GenerationMethod />

有没有办法返回 NULL 以便不生成空的 XML 标记?

这是方法。谢谢!

public static IEnumerable<GenerationMethod> GetGenerationMethod(this DungeonGrid monster)
{

    var customMonster = monster.Stats
            .Where(e => e.Stat.Category.IsActive);

    if (monster.MonsterType.DestructionMethod.StartsWith("TEST"))
    {
        yield return new GenerationMethod(monster.MonsterType.DestructionMethod);
    }

    foreach (Stat in customMonster)
    {
        if (DungeonLookupByStatId.ContainsKey(customMonster.MonsterType.Id))
            yield return DungeonLookupByStatId[customMonster.MonsterType.Id];
    }
}

标签: c#asp.net-coreautomapperienumerable

解决方案


您的最终目标是GenerationMethod在 IEnumerable 为空的情况下不将标记包含在 XML 中。

所以我建议你完全处理这个问题,而不是改变返回IEnumerable.
IEnumerable就像薛定谔的猫。它有所有项目,根本没有项目,只有当你实际枚举时,你才会确切知道它将产生什么项目。
因此,返回 null 而IEnumerable不是IEnumerable.

因此,要回答您的问题,请创建您自己的 xml 序列化程序(这是关于如何实现该目标的答案,或者只是查找它。它应该非常简单)。您需要做的就是更改IEnumerable写入 XML 的方式。
逻辑应该很简单:

  1. 调用.ToList()你的扩展方法IEnumerable来枚举它。
  2. 如果列表有项目,请创建标签并以常规方式添加标签。
  3. 如果列表为空,则不执行任何操作。

我希望它能给你你正在寻找的方向。


推荐阅读