0

在尝试模拟要枚举的集合时,我遇到了一个奇怪的 NullReferenceException,我无法理解。我不认为这是由 Mock 引起的,但我不能 100% 确定。任何人都可以识别出我在做什么愚蠢的事情吗?

InfoDataSet<OrderItemInfo> orders = OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID);
foreach (OrderItemInfo orderItem in orders)
{
    // Exception thrown on the first attempt to get an OrderItem in the foreach
}

这行代码的堆栈跟踪如下:

System.NullReferenceException:对象引用未设置为
对象的实例。结果 StackTrace:在
CMS.SettingsProvider.ObjectDataSet 1.GetObjectEnumerator() 在 CMS.SettingsProvider.InfoDataSet`1.d__0.MoveNext() 在 ...1.GetEnumerator() at
CMS.SettingsProvider.ObjectDataSet


集合的内容只是一个 IEnumerable 的包装器。就我而言,这应该让您对正在发生的事情有所了解。GetEnumerator(隐式和非隐式)实现只需调用值。

    private IEnumerable<T> values;

    /// <summary>
    /// Initializes a new instance of the <see cref="MockDataSet{T}"/> class.
    /// </summary>
    /// <param name="values">The values.</param>
    public MockDataSet(IEnumerable<T> values)
    {
        if (values == null)
            throw new ArgumentNullException("values");

        this.values = values;
    }

值中有一个值,我可以通过监视窗口很好地枚举...

在此处输入图像描述

谁能解释我在这里做错了什么?

4

2 回答 2

1

这有点奇怪,我认为这部分取决于下面的 CMS(Kentico)。我之前遇到了一个问题,我发布了一个关于Unable to call ToArray() on 3rd party class的问题,我刚刚意识到这可能会产生同样的影响。

编译器似乎InfoDataSet<OrderItemInfo> orders = OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID);很难确定结果的类型。因此,我认为下面正在发生演员表说

((IEnumerable<OrderItemInfo>)orders)

我相信这是失败的,导致 IEnumerable 为空,因此出现 NullReferenceException。解决方案是每个项目的简单转换:

InfoDataSet<OrderItemInfo> orders = OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID);
foreach (OrderItemInfo orderItem in orders.Cast<OrderItemInfo>())
{
   // Now works
}
于 2013-11-25T17:26:23.393 回答
0

orders一片空白。您认为这不是因为循环已经开始,而是请记住这是懒惰的评估。

像这样更改代码,它不会失败:

InfoDataSet<OrderItemInfo> orders = OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID);
if (orders != null)
{
  foreach (OrderItemInfo orderItem in orders)
  {
      // Exception thrown on the first attempt to get an OrderItem in the foreach
  }
}

还要记住,每当您在调试器中查看某些东西时,周期时间已经过去了很长时间——如果您有任何异步更新,它可能还没有完成。

于 2013-11-25T17:14:56.017 回答