【问题标题】:Pass Generic ObservableCollection to a method and iterate over it将 Generic ObservableCollection 传递给方法并对其进行迭代
【发布时间】:2017-05-22 07:30:58
【问题描述】:

我有 2 个 ObservableCollections,比如 class1 和 class2 类型。

private ObservableCollection<Class1> cOne; // collection of objects of type Class1
private ObservableCollection<Class1> cTwo; // collection of objects of type Class2

现在在下面的方法中,我想遍历这个集合并访问对象的成员。

public void MyMethod<T> (){
    var listOfLayers = new ObservableCollection<T>();

    if (typeof(T) == typeof(Class1))
    {
       listOfLayers = (T) cOne;    
    }
    else{
       listOfLayers = (T) cTwo;  
    }

    foreach (var entry in listOfLayers){
        WL entry.someprop;
    }

}

但是每次关于类型转换的时候我都会出错。

错误 CS0030 无法转换类型 'System.Collections.ObjectModel.ObservableCollection' 到 'T'

请注意,我没有根据类型创建两种方法,因为这两种方法本质上都是在不同的数据库表中做同样的事情。因此它们都会包含重复的代码。

【问题讨论】:

    标签: c# generics generic-list generic-method


    【解决方案1】:

    您正在尝试将 T (T) cOne; 类型的某些内容转换为 ObservableCollection&lt;T&gt; 类型的内容,这就是您收到错误的原因。这意味着 cOne 应该被转换为 ObservableCollection&lt;T&gt;

    【讨论】:

      【解决方案2】:

      您可能应该转换为ObservableCollection&lt;T&gt; 而不仅仅是T。您更正了代码:

      public void MyMethod<T> (){
          var listOfLayers = new ObservableCollection<T>();
      
          if (typeof(T) == typeof(Class1))
          {
             listOfLayers = (ObservableCollection<T>) cOne;    
          }
          else{
             listOfLayers = (ObservableCollection<T>) cTwo;  
          }
      
          foreach (var entry in listOfLayers){
              WL entry.someprop;
          }
      }
      

      作为一个侧节点,您的代码看起来有点奇怪。这也可能是因为您简化了示例以证明您的观点,但仍然:cOne 已经是正确的类型,那么您为什么要转换它?

      如果您想使用T 类型安全的方法,最好为您要支持的每个ObservableCollection&lt;T&gt; 创建一个自己的方法,这样您就不必传递类型来执行它。我猜你还想为不同的T 执行不同的逻辑,所以拆分它是有意义的。

      【讨论】:

      • 感谢 Florian 的出色回答。我做了建议的更改,但它仍然抛出相同的错误:“'System.Collections.ObjectModel.ObservableCollection' to 'System.Collections.ObjectModel.ObservableCollection'”。我想我现在最好创建两个单独的方法,但是它们将包含或多或少相同的代码。
      • 您确定 else 分支中没有发生此异常吗?那会不会是typeof(T) != typeof(Adjust‌​IT.Landbase)
      • 请注意,您不能转换为基本类型(因此,如果 TAdjustIT.Landbase 的父类,则转换将失败),请参阅此答案为什么不:stackoverflow.com/a/43378505/2259391
      【解决方案3】:

      你做演员的方式不对。它应该是listOfLayers = (ObservableCollection<T>) cOne,因为listOfLayersObservableCollection&lt;T&gt;,而不是T


      我不清楚你为什么需要演员阵容。您可以将cOnecTwo 作为参数传递给该方法,并使用更简洁的代码。我敢打赌 Class1Class2 在某种程度上是相关的,所以它们可能共享一个公共基类或接口,你可以提出 ObservableCollection&lt;IBaseClass&gt; 的论点。

      【讨论】:

      • Class1 和 Class2 实际上是模型类。它们代表数据库表。我尝试强制转换的方法基本上是做一些数据库查询并初始化 ObservableCollection.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 2016-07-14
      • 1970-01-01
      • 2019-03-04
      相关资源
      最近更新 更多