我有一个非常复杂的对象,正在处理它的各种代码。其中有一个简单的“产品”对象列表,我想向“任何”字段添加一个值。
“根”对象看起来像这样(简化):
public class RefundBasics
{
public InvoiceDetail Invoice { get; set; }
// more....
}
InvoiceDetail
看起来像:
public class InvoiceDetail
{
public SaveSaleRecord.SaveSaleRequest sale { get; set; }
// more....
}
SaveSaleRequest
看起来像:
public class SaveSaleRequest
{
public Customer Customer { get; set; }
public ConcurrentQueue<SimpleProduct> Items { get; set; }
// more....
}
我遇到麻烦的关键对象是上面的
ConcurrentQueue<SimpleProduct> Items
。
所以我有一些简单的代码被调用:
ReplenishStockOnRefundedItems(Refund, replenish_location, user, apikey, saveChanges);
上一行中的
Refund
是一个RefundBasics
对象
这个函数看起来像这样(简化):
internal static void ReplenishStockOnRefundedItems(RefundBasics Refund, string replenish_location, int user, string apikey, bool doit)
{
foreach (SimpleProduct item in Refund.Invoice.sale.Items)
{
if (!item.PickPhysicalProduct || item.Quantity <= 0)
continue;
string replenish_location_id = "";
// Some code to determine the value of replenish_location_id
// Now store replenish_location_id on this item in the ConcurrentQueue
item.Any = replenish_location_id;
}
}
我期待发生的事情:
循环我所有的项目并将
replenish_location_id
分配给项目的Any
属性后,我可以稍后在我的代码中使用它。
实际发生的事情:
Item.Any
始终为空(默认值),该值未分配给属性。
任何想法为什么......?我在想这可能是因为它是一个
ConcurrentQueue
,但是,那是回到前面?并发对象在这种循环中应该是线程安全的并且更可靠?这就是它的理解方式以及我在这里使用它们的原因。
我也有一次在我的循环之前有一个
Linq
.Where
而不是 continue
某些项目不适用的声明,认为这可能会创建一组新的对象并因此丢失实例,但改变它上面的代码没有任何区别,所以我很确定这不是一个实例问题——除非我误解了什么。
编辑-以下问题:
SimpleProduct
是一个类,看起来像这样:
public class SimpleProduct
{
public object Any { get; set; }
// more properties...
}
是的,我确定代码在
if
语句之后执行。
并发不是实际上这个特定代码部分所必需的,但由于
SaveSaleRequest
是我代码中的常用对象,它是其他事情所必需的,因此项目列表因此是并发队列。我 could 之前将它转换为列表,然后在运行此代码时再次转换回来,但我认为我不必这样做 - 除非我想念某些东西?