避免lambda表达式中由于冗余转换而导致的代码分析CA1800错误

避免lambda表达式中由于冗余转换而导致的代码分析CA1800错误,lambda,refactoring,expression,code-analysis,Lambda,Refactoring,Expression,Code Analysis,背景 我有一个接口Interface1,它由Interface2、Interface3…等继承。除了接口1,所有其他接口都有具体的类(object2、object3..等),这些类实现各自的接口接口2、接口3..等 我还有一个Interface 1类型的对象集合,我的目的是填充各种对象 问题 我想从这个集合中提取一个特定的对象,并对其使用lambda表达式 Object2 = IInterface1Collection.Single(item => item.GetType()==type

背景

我有一个接口Interface1,它由Interface2、Interface3…等继承。除了接口1,所有其他接口都有具体的类(object2、object3..等),这些类实现各自的接口接口2、接口3..等

我还有一个Interface 1类型的对象集合,我的目的是填充各种对象

问题

我想从这个集合中提取一个特定的对象,并对其使用lambda表达式

Object2 = IInterface1Collection.Single(item => item.GetType()==typeof(Object2)
            && ((Object2)item).Property1=="John" && ((Object2)item).Property2==0);
该代码给出了CA1800的代码分析性能错误。上面说

错误1 CA1800:Microsoft。性能:“项”是一个参数,在方法“Method1()”中多次转换为类型“Object2”。缓存“as”运算符或直接强制转换的结果,以消除冗余的castclass指令

如果我抑制该消息,它会正常工作,并获得满足条件的Object2

问题


如何避免此错误消息?我必须将该项强制转换为Object2,否则无法访问其属性。我负担不起创建Object2的集合。

我建议首先使用类型为的

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);