【问题标题】:Avoid null to enter into list避免 null 进入列表
【发布时间】:2014-02-13 15:03:02
【问题描述】:

请看下面的代码

1. persons = Items.Select(item => componentResolver.ResolvePerson(new TridionUri(item.Id))).ToList();
2. persons.Each(person => person.AdditionalInfo); // gives null reference exception

ResolvePerson 看起来像:

public Person ResolvePerson(TridionUri personUri)
{
    Person person = publicationResolverService.GetPerson(personUri);
    if (author != null)
    {
        person.Id = personUri.ItemId.ToString();
    }
    return person;
}

现在的问题是,“项目”包含一个人不存在的 ID。所以我的“ResolvePerson”返回一个空值。这导致第 2 行出现异常。我只能控制 ResolvePerson 方法。有没有办法可以跳过没有人的 personUri 而不是返回 null?

【问题讨论】:

  • EachIEnumerable 扩展名还是ForEach 中的拼写错误?
  • IEnumerable 扩展。
  • 然后使用@wudzik的解决方案
  • 似乎没有人真正阅读这里的问题。

标签: c# .net list lambda anonymous-methods


【解决方案1】:

您应该在使用 where 子句调用第二行之前过滤掉 null 项。但是如果你不能像你说的那样控制那个代码,你可以返回一个“假”Person,它知道它是假的,当你调用AdditionalInfo时什么都不做

Person person = publicationResolverService.GetPerson(personUri);
if (author != null)
{
    person.Id = personUri.ItemId.ToString();
}
else
{
    person = _fakePerson;
}
return person;

【讨论】:

  • 这是什么_fakePerson ??它是我必须创建的 Person 类的对象吗?
  • @RossCooper 这基本上是一个 hack,所以这取决于 AdditionalInfo 的作用。您无法过滤掉空值,但您可以创建Person 的实例,它在调用 AdditionalInfo 时不执行任何操作。当然,这需要更改 Person 的实现。
  • @RossCooper 如果您向我们展示person 类和Each 扩展方法会更容易
  • 返回一个空白实例将消除错误,但会保留一个额外的元素。该信息最终必须到达前端,在那里会出现一个空白占位符。每种方法都不值得关注,它对每个方法来说都是正常的,但是一旦出现 null 元素并尝试访问属性 AdditionalInfo,它就会给出 null 引用异常
  • @RossCooper 您不能使实例不可见。要么返回 null 并使用 where 子句将其过滤掉,要么返回非 null 的内容并确保它不执行任何操作或显示在任何地方。
【解决方案2】:

您可以使用Linq 中的Where 过滤空人

persons.Where(person => person != null).Each(person => person.AdditionalInfo);

【讨论】:

  • 我无法控制这个文件。只有 ResolvePerson 方法是我可以编辑的。
猜你喜欢
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
相关资源
最近更新 更多