6

いくつかの基準に基づいて Windows ログを取得およびフィルタリングしようとしています。そのうちの 1 つはMessage. MessageプロパティはにありますEventLog.GetEventLogs().Entries.Message。問題はEntriesEventLogEntryCollectionラムダ式 ( where ) を実行できないことです。また、IEnumberable (List) 型にキャストしようとしましたが、例外がスローされ、キャストできないと表示されます。EventLogもう 1 つの問題は、読み取り専用のプロパティであるため、新しいオブジェクトを作成してエントリを手動で追加することが事実上不可能になることです。最初に私が試したのは:

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

EventLogEntryCollection(クエリで によって返されるオブジェクトの型)は、ジェネリックではなくx.Entriesのみを実装します。Linq メソッドで使用するには、各要素をキャストする必要があります。IEnumerableIEnumerable<EventLogEntry>

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

Cast<T>()any を受け入れてIEnumerableを返しますIEnumerable<T>。各要素は要求された型に単純にキャストされ、失敗すると ClassCastException が発生します。このEventLogEntryコレクションにあるオブジェクトのタイプは だけであるため、これは安全な操作です。

OfType<T>()例外を発生させるのではなく、要求された型にキャストできない要素を省略することを除いて、同様です。この特定のケースでは、観察可能な動作は同一である必要があります。)

于 2013-05-02T17:50:34.097 に答える