6

我正在尝试根据某些条件获取和过滤 Windows 日志,其中之一是 filter by Message。该Message物业位于EventLog.GetEventLogs().Entries.Message. 问题是EntriesEventLogEntryCollection我无法在其上运行 lambda 表达式(where)。我还尝试将其转换为 IEnumberable (List) 类型,但它会引发异常并说无法转换。另一个问题是它是一个只读属性,这使得几乎不可能创建一个新EventLog对象并手动添加条目。最初我尝试的是:

List<EventLog> filteredList = EventLog.GetEventLogs().Where(
x => string.Equals(x.LogDisplayName, "Some Value")).Where(x => x.Entries.Where(...

但显然Entries.Where()行不通,因为它不是 IEnumberable。我已经考虑了几个小时的替代解决方案,但我现在绝望了。任何帮助是极大的赞赏。

4

1 回答 1

11

EventLogEntryCollectionx.Entries查询中返回的对象类型)仅实现IEnumerable,而不是泛型IEnumerable<EventLogEntry>。要将它与 Linq 方法一起使用,您必须强制转换每个元素:

x => x.Entries.Cast<EventLogEntry>().Where(...

Cast<T>()接受 anyIEnumerable并返回一个IEnumerable<T>,其中每个元素都简单地转换为请求的类型,如果失败则引发 ClassCastException 。由于EventLogEntry是该集合中唯一应该存在的对象类型,因此这是一个安全的操作。

(OfType<T>()是类似的,除了它会省略不能转换为请求类型的元素而不是引发异常。在这种特殊情况下,可观察的行为应该是相同的。)

于 2013-05-02T17:50:34.097 回答