2

バックグラウンド

Interface2、Interface 3などに継承されるインターフェイスInterface1があります。インターフェイス 1 を除いて、他のすべてのインターフェイスには、それぞれのインターフェイス インターフェイス 2、インターフェイス 3 などを実装する具象クラス (object2、object3..etc) があります。

また、タイプ Interface 1 のオブジェクトのコレクションもあり、さまざまなオブジェクトを設定するつもりです。

問題

このコレクションから特定のオブジェクトを抽出したいので、ラムダ式を使用しています。

Object2 = IInterface1Collection.Single(item => item.GetType()==typeof(Object2)
            && ((Object2)item).Property1=="John" && ((Object2)item).Property2==0);

このコードにより、CA1800 のコード分析パフォーマンス エラーが発生しています。それは言う

エラー 1 CA1800: Microsoft.Performance: パラメータの 'item' が、メソッド 'Method1()' で型 'Object2' に複数回キャストされています。冗長な castclass 命令を排除するために、'as' 演算子または直接キャストの結果をキャッシュします。

メッセージを非表示にすると、正常に機能し、条件を満たす Object2 が取得されます。

質問

このエラー メッセージを回避するにはどうすればよいですか? そうしないと、そのプロパティに到達できないため、アイテムを Object2 にキャストする必要があります。代わりに Object2 のコレクションを作成する余裕はありません。

4

1 に答える 1

2

最初に使用することをお勧めしOfTypeます:

Object2 = IInterface1Collection.OfType<Object2>()
                               .Single(item => item.Property1 == "John" && 
                                               item.Property2 == 0);

のサブクラスのインスタンスも含まれるという点で、これは少し異なる動作をすることに注意してください。問題ありますか?もしそうなら、いつでも書くことができます:Object2

Object2 = IInterface1Collection.OfType<Object2>()
                               .Single(item => item.GetType() == typeof(Object2))
                                               item.Property1 == "John" && 
                                               item.Property2 == 0);
于 2012-10-12T13:42:29.757 に答える