背景
我有一个接口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的集合。
答案 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);