一些背景资料;
- LanguageResource 是基类
- LanguageTranslatorResource 和 LanguageEditorResource 继承自 LanguageResource
- LanguageEditorResource 定义了一个 IsDirty 属性
- LanguageResourceCollection 是 LanguageResource 的集合
- LanguageResourceCollection 在内部将 LanguageResources 保存在
Dictionary<string, LanguageResource> _dict
- LanguageResourceCollection.GetEnumerator() 返回
_dict.Values.GetEnumerator()
我有一个 LanguageResourceCollection _resources,它只包含 LanguageEditorResource 对象,并且想使用 LINQ 来枚举那些脏的,所以我尝试了以下方法。我的具体问题以粗体显示。
_resources.Where(r => (r as LanguageEditorResource).IsDirty)
Intellisense 没有显示其他 LINQ 方法,但我还是对其进行了编码,并被告知“LanguageResourceCollection 不包含'Where'的定义并且没有扩展方法......”。
为什么 LanguageResourceCollection 实现 IEnumerable 的方式使其无法支持 LINQ?如果我将查询更改为
(_resources as IEnumerable<LanguageEditorResource>).Where(r => r.IsDirty)
Intellisense,则会显示 LINQ 方法并且解决方案会编译。但是在运行时我得到一个 ArgumentNullException “值不能为空。参数名称:源”。
这是我的 LINQ 代码中的问题吗?
类的一般设计有问题吗?
如何深入研究 LINQ 生成的内容以尝试查看问题所在?
我对这个问题的目标不是为特定问题找到解决方案,因为我现在必须使用其他(非 LINQ)方法来解决它,而是尝试提高我对 LINQ 的理解并学习如何改进设计我的课程可以更好地使用 LINQ。