2

背景

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

我还有一组 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。

问题

如何避免此错误消息?我必须将 item 转换为 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 回答