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

时间:2012-10-12 13:39:04

标签: lambda refactoring expression code-analysis

背景

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

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

问题

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

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

此代码提供CA1800的代码分析性能错误。它说

  

错误1 CA1800:Microsoft.Performance:'item',一个参数,在方法'Method1()'中多次强制输入'Object2'。缓存'as'运算符或直接强制转换的结果,以消除冗余的castclass指令。

如果我压制消息,它可以正常运行并让我满足条件。

问题

如何避免此错误消息?我必须将项目转换为Object2,否则我无法达到其属性。我不能代替创建Object2的集合。

1 个答案:

答案 0 :(得分: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);