Я использую API электронной коммерции SOAP, извините, если он слишком запутанный, чтобы ответить. Я просто хочу знать, просто ли я делаю глупую ошибку, прежде чем писать тикет сопровождающим API.
public void WriteXML()
{
var results = GetProductsFromApi().results.ToList();
using (var file = File.Create(@"products.xml"))
{
var list = new List<Product>();
var writer = new XmlSerializer(typeof(List<Product>));
foreach (var result in results)
{
var newProduct = new Product
{
Id = result.productId,
Index = result.productDisplayedCode,
Stock = result.productStocksData.productStocksQuantities[0].productSizesData[0].productSizeQuantity,
IsIgnored = false,
IsInDelivery = false
};
list.Add(newProduct);
}
writer.Serialize(file, list);
}
}
Я сделал запрос к API и хочу сохранить его в списке, поэтомукаждый результат сериализуется в XML позже. Приведенный выше код работает, если я установлю Stock
на что-то вроде Stock = 1,
- однако, если оставить все как есть, программа закроется с Unhandled exception: System.IndexOutOfRangeException
.
Что странно, если я сделаю что-то похожее наперед построением объекта Product
:
Console.WriteLine(result.productStocksData.productStocksQuantities[0].productSizesData[0].productSizeQuantity);
... Я получил правильный ответ API.
Понятия не имею, что происходит. Я пытался проверить, равен ли результат null
перед построением Product
, но это не помогло. Всё исключение настолько сбивает меня с толку, что я не знаю, с чего начать.
Редактировать : используя предложенный Fildor код, я написал следующее:
float? lol = result.productStocksData.productStocksQuantities.FirstOrDefault().productSizesData.FirstOrDefault()?.productSizeQuantity ?? null; //doesn't actually change anything if it's null or 0
if (lol.GetValueOrDefault() == 0) {
lol = 1;
};
var newProduct = new Product
{
Id = result.productId,
Index = result.productDisplayedCode,
Stock = (float)lol,
IsIgnored = false,
IsInDelivery = false
};
Console.WriteLine("Processed product has a stock of " + lol);
list.Add(newProduct);
Теперь это приводит к System.NullReferenceException
. Он отвечает с реальным размером запаса, и указанная ошибка появляется после.