【问题标题】:ObservableCollection passed as parameter and InterfacesObservableCollection 作为参数和接口传递
【发布时间】:2013-08-18 03:32:18
【问题描述】:

我有一个接口IPerson 和两个实现它的类AdventurerWorker。我目前有单独的ObservableCollections 用于冒险家和工人。我有一个方法,我希望能够将ObservableCollection<Adventurer>ObservableCollection<Worker> 作为参数传递给,但到目前为止我还没有运气。该方法仅使用在IPerson 中实现的属性,如果我将其声明为:

public void MyMethod(ObservableCollection<IPerson> collection)

...方法本身没有错误。但是,当我尝试传入 ObservableCollection&lt;Adventurer&gt; 时,出现 2 个错误:

无法从“System.Collections.ObjectModel.ObservableCollection”转换为“System.Collections.ObjectModel.ObservableCollection”`

'AoW.MyMethod(System.Collections.ObjectModel.ObservableCollection)' 的最佳重载方法匹配有一些无效参数`

我可以将两个ObservableCollections 传递给同一个方法吗?如果是这样,我应该怎么做?任何建议将不胜感激。

【问题讨论】:

    标签: c# interface observablecollection


    【解决方案1】:

    .NET 中的类不支持covariance and contravariance。只有接口可以。想象一下这种情况:

    class Adventurer : IPerson { }
    class NPC : IPerson { }
    
    public void MyMethod(ObservableCollection<IPerson> collection)
    {
        collection.Add(new NPC());
    }
    
    var collectionOfAdventurers = new ObservableCollection<Adventurer>();
    MyMethod(collectionOfAdventurers);
    

    这显然会引发一些错误,因为传入的类型是Adventurer集合,但是方法添加了NPC,但这在编译时无法验证。因此,编译器不会允许这种不安全的行为,而是要求传入的类型必须与签名中的类型完全匹配,如果您尝试传入其他任何内容,则会给出错误。

    我建议将MyMethod 更改为:

    public void MyMethod(IEnumerable<IPerson> enumerable)
    

    或者

    public void MyMethod(INotifyCollectionChanged collection)
    

    具体取决于您需要访问的成员。

    您可能还想考虑一个泛型方法:

    public void MyMethod<T>(ObservableCollection<T> collection) where T : IPerson
    

    【讨论】:

    • 更改为IEnumerable&lt;IPerson&gt; 成功了。感谢您的帮助。
    【解决方案2】:

    你不能这样做,因为

    ObservableCollection<IPerson> 
    

    是 本身是另一种类型(例如,您可以在其中同时放入 Adventurer 或 Worker,但不能在 Adventurer 或 Worker 的集合中这样做)

    一种解决方案可能是在您的方法中允许 IPerson 的 IEnumerable,然后使用以下方法调用它:

    ObservableCollection<Worker> col = ...
    MyMethod(col.Cast<IPerson>());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-04
      • 2020-12-20
      • 1970-01-01
      • 2010-10-16
      • 2017-05-29
      • 2011-02-02
      • 2011-02-21
      • 2015-03-18
      相关资源
      最近更新 更多