我有一些抽象类在我的项目中具有某些UserControls
的核心功能。我还有两个单独的实现,都源自Abstract类;我们可以调用它们AbstractImpl1
和AbstractImpl2.
此外,我有几个地方迭代的抽象Collections
UserControls
。
我遇到的问题是InvalidCastExceptions
- 我需要遍历实现而不是使用abstact UserControl来获取某些属性(可视化)。除了做try/catch
之外,有没有一种干净的方式处理这个问题?
示例:
在我的项目中,我有抽象类:AbsUserControl
然后我有两个单独的实现:AbstractImpl1
和AbstractImpl2
在我的主要表单中,我有ObservableCollection<AbsUserControl> absControlCollection
,然后遍历我foreach(AbstractImpl1 userControl in absControlCollection)
的项目,以便能够访问视觉方面。问题是ObservableCollection<AbsUserControl> absControlCollection
可能由AbstractImpl1
或AbstractImpl2
个对象组成。
有没有一个干净的方法处理这个?现在,我遍历absControlCollection
中的对象的每个地方都用try/catch
块围绕它,试图遍历AbstractImpl1
个对象然后捕获InvalidCastException
并继续迭代通过AbstractImpl2
个对象。
如果需要更多信息,请与我们联系。谢谢!
答案 0 :(得分:2)
使用OfType
为您进行过滤:
foreach(AbstractImpl1 userControl in
absControlCollection.OfType<AbstractImpl1>())
{
...
}
答案 1 :(得分:2)
OfType
的替代方案;铸造没有例外:
foreach(AbsUserControl control in absControlCollection)
{
if(control is AbstractImpl1)
{
AbstractImpl1 i1 = (AbstractImpl1)control;
DoStuff(i1);
}
if(control is AbstractImpl2)
{
AbstractImpl2 i2 = (AbstractImpl2)control;
DoOtherStuff(i2);
}
}
答案 2 :(得分:0)
您可以使用LINQ的 OfType
方法安全地过滤掉您感兴趣的具体实现。您的foreach
将如下所示:
foreach(var userControl in abcControlCollection.OfType<AbstractImpl1>())
{
/* ... */
}