在基本列表中获取派生类型的item属性

时间:2019-07-12 20:45:43

标签: c# list interface nodes children

我有一个元素列表,我想获得一个在其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'OpenXmlElementSheet类的基类,(请参见下面的层次结构),但是我认为我正在尝试访问{ {1}}元素。我在做什么错了?

类层次结构:

Sheet

1 个答案:

答案 0 :(得分:0)

actualSheetsList.Descendants<Sheet>()返回具有Name属性的Sheet类型的项目。

actualSheetsList.ChildElements返回一个OpenXmlElementList实例,其中每个项目均为OpenXmlElement类型,没有Name属性,因此代码无法编译。

要访问Name属性,您需要具有定义该属性的具体类型,而不是其基类。