【问题标题】:Generic list conversion通用列表转换
【发布时间】:2012-03-22 10:38:52
【问题描述】:

我有三门课

public class OSiteEquipment : IPlantItem
public class OSiteSubSystem : IPlantItem
public class OSiteComponent : IPlantItem

每个实现接口IPlantItem

在我的 xaml 中,我绑定到像这样的 Observable 集合

public ObservableCollection<IPlantItem> CurrentItems

有时我需要将CurrentItems 绑定到 OSiteEquipments 的集合,有时需要绑定到 OSiteSubSystem

如果我在像这样加载视图时尝试设置 CurrentItems

CurrentItems = this.siteDocument.Sitestructure.Equipments;

Sitestructure.Equipments 是一个可观察的 OSiteEquipment 集合,编译器说我无法从 Observablecollection&lt;IPlantItem&gt; 转换为 Observablecollection&lt;OSiteEquipment&gt;

有没有办法解决这个问题。我需要进行显式转换吗

编辑

解决了它,而不是将 CurrentItems 定义为 ObservableCollection i 为

object CurrentItems

我一开始没有这样做的原因是我认为我会破坏通知绑定,但它仍然可以正常工作。

【问题讨论】:

  • 为什么要避免显式转换?
  • Observablecollection&lt;OSiteEquipment&gt; 不是Observablecollection&lt;IPlantItem&gt;。所以当然是编译器对象。
  • 看起来ObservableCollection 不是协变的,所以需要显式转换。

标签: c# collections interface


【解决方案1】:

ObservableCollection&lt;OSiteEquipment&gt;Observablecollection&lt;IPlantItem&gt; 的显式转换也不起作用。如果您想让它工作,您需要将OSiteEquipment 集合的元素复制到新的IPlantItem。但是对原始集合的更改不会影响新集合,所以这不是您想要的。

您已经找到了解决方案,但我认为将CurrentItems 的类型更改为IEnumerable&lt;IPlantItem&gt; 会更好。这不应该影响绑定,但它意味着您的代码更安全且更自文档化(更明显的是该属性应该是什么)。

【讨论】:

    猜你喜欢
    • 2010-10-15
    • 2013-08-24
    • 1970-01-01
    • 2010-10-18
    • 2010-10-07
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多