我有一个元素列表,我想获得一个在其name属性中具有某些值的元素,但编译器会向我显示基本属性。
我在C#中使用OpenXML
库。
using DocumentFormat.OpenXml.Spreadsheet;
SpreadsheetDocument actualFile = SpreadsheetDocument.Open(@"C:\Somefile\Somepath.xlsx", false);
Sheets actualSheetsList = actualFile.WorkbookPart.Workbook.Sheets;
给我一个Sheet
对象的集合,在foreach
范围内,我可以item.Name == "someName"
进行操作。
但是我想使用Linq来获取该项目,而不必获取它并打破循环。所以我来到:
actualSheetsList.OfType<Sheet>().Where(x => x.Name.ToString().Contains("someName")).First();
或
actualSheetsList.Descendants<Sheet>().Where(x => x.Name.ToString().Contains("someName")).First();
哪种方法效果很好(接受改进建议)。但我想了解一下我的初衷
actualSheetsList.ChildElements.First()
给我一个Sheet
元素,但是
actualSheetsList.ChildElements.First(x => x.Name.ToString().Contains("someName"));
没有,它给我错误CS1061: 'OpenXmlElement' does not contain a definition for 'Name'
,OpenXmlElement
是Sheet
类的基类,(请参见下面的层次结构),但是我认为我正在尝试访问{ {1}}元素。我在做什么错了?
类层次结构:
Sheet
答案 0 :(得分:0)
actualSheetsList.Descendants<Sheet>()
返回具有Name
属性的Sheet
类型的项目。
actualSheetsList.ChildElements
返回一个OpenXmlElementList
实例,其中每个项目均为OpenXmlElement
类型,没有Name
属性,因此代码无法编译。
要访问Name
属性,您需要具有定义该属性的具体类型,而不是其基类。