异步和匿名类型
本文关键字:类型 异步 | 更新日期: 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
正在做的事情。查询本身只是查询的定义,而不是结果。