异步和匿名类型

本文关键字:类型 异步 | 更新日期: 2023-09-27 17:59:31

此方法:

private async Task readFileInfo(string folderId)

调用了另一个方法:

importCount = await VM.importVehicles(myXDoc);

这里定义:(注意:我把for循环改成了for each,但我得到了类似的结果)。

public async Task<Int32> importVehicles(XDocument importXMLDocument)
{
    var Importedvehicles = from vehicle in importXMLDocument.Descendants("vehicle")
                           select new
                           {
                               VehicleName = vehicle.Element("VehicleName").Value,
                               VehicleYear = vehicle.Element("VehicleYear").Value,
                               Odometer = vehicle.Element("Odometer").Value,
                               LicensePlate = vehicle.Element("LicensePlate").Value,
                               OilWeight = vehicle.Element("OilWeight").Value,
                               OilQuantity = vehicle.Element("OilQuantity").Value,
                               OilFilterModelNumber = vehicle.Element("OilFilterModelNumber"),
                               AirFilterModelNumber = vehicle.Element("AirFilterModelNumber"),
                               OilChangedDate = vehicle.Element("OilChangedDate"),
                               OilChangedOdometer = vehicle.Element("OilChangedOdometer"),
                               NextOilChangeDate = vehicle.Element("NextOilChangeDate"),
                               NextOilChangeOdometer = vehicle.Element("NextOilChangeOdometer"),
                               SettingDistance = vehicle.Element("SettingDistance"),
                               SettingMonths = vehicle.Element("SettingMonths"),
                           };
    Int32 vehicleId;
    vehicleId = await getMaxVehicleId();
    try
    {
        foreach (var item in Importedvehicles)
        {
            vehicle myImportedVehicle = new vehicle();
            myImportedVehicle.VehicleId = vehicleId += 1;
            myImportedVehicle.ImagePath = "Assets/car2.png";
            myImportedVehicle.VehicleName = item.VehicleName;
            myImportedVehicle.VehicleModel = item.VehicleName;

            myImportedVehicle.VehicleYear = short.Parse(item.VehicleYear);
            myImportedVehicle.CurrentOdometer = Convert.ToInt32(item.Odometer);
            myImportedVehicle.LicensePlate = item.LicensePlate;
            myImportedVehicle.LastOilChangedDate = Convert.ToDateTime(item.OilChangedDate.Value.ToString()).ToString("d");
            myImportedVehicle.LastOilChangedOdometer = (Int32)item.OilChangedOdometer;
            myImportedVehicle.ReminderDistance = (Int32)item.SettingDistance;
            myImportedVehicle.ReminderMonths = (Int32)item.SettingMonths;
            vehicleInformation myImportVI = new vehicleInformation();
            myImportVI.OilWeight = item.OilWeight;
            myImportVI.OilAmount = item.OilQuantity;
            myImportVI.OilFilterNumber = item.OilFilterModelNumber.Value.ToString();
            myImportVI.AirFilterNumber = item.AirFilterModelNumber.Value.ToString();
            myImportedVehicle.vehicleInfo = myImportVI;
            m_vehicles.Add(myImportedVehicle);
        }
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message.ToString());
    }
        await SaveList();
        return Importedvehicles.Count();
    }

我收到一个错误:

对象引用未设置为对象的实例。

当我遍历它时,iVehicle会高亮显示,但随后它会直接转到for语句。然后它会出错,因为它看起来还没有从iVehicle得到结果。

异步和匿名类型

这并不能100%回答您的问题,但它应该会给您一个良好的开端。

调试器在声明iVehicle之后直接跳转到for...loop的原因是,当您声明查询时,查询不会被执行。因此,iVehicle在这一点上不是匿名类型的集合。

当您调用.Count()时,查询正在执行,iVehicle正试图转换为一个适当的匿名类型集合。但是,因为查询中的某些内容(在调用.Count()之后执行)是null,所以您将收到一个NullReferenceException

您应该首先验证importXMLDocument和对Descendants()调用的返回值都不为null。

希望这能有所帮助。

编辑:

现在您已经给出了一个完整的例子,您有很多可能是null的地方。

每次使用此:

vehicle.Element("SomeElementNameHere")

这可能是null。然后您将调用null对象的.Value属性。

你需要确保每个元素都在那里。隔离每个病例,并确定哪一个是null

试着这样写代码:

var query =
    from vehicle in importXMLDocument.Descendants("vehicle")
    select new { ... };
var  iVehicle = query.ToArray();
for (var i = 0; i <= iVehicle.Count(); i++)
{
    ...
}

您需要强制对查询进行求值。这就是.ToArray正在做的事情。查询本身只是查询的定义,而不是结果。