将Generic ObservableCollection传递给方法并迭代它

时间:2017-05-22 07:30:58

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

我有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无法转换类型   &#39; System.Collections.ObjectModel.ObservableCollection&#39;到了&#39;

请注意,我还没有基于类型创建两个方法,因为这两种方法基本上都会在不同的数据库表中执行相同的操作。因此他们都会包含重复的代码。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可能应该转为ObservableCollection<T>,而不仅仅是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 typesafe的方法,那么为你想要支持的每个ObservableCollection<T>创建一个自己的方法可能会更好,所以你不必传递一个类型来执行它。我猜你也想为不同的T执行不同的逻辑,所以拆分这是有道理的。

答案 2 :(得分:0)

你进行演员表演的方式不对。它应该是listOfLayers = (ObservableCollection<T>) cOne,因为listOfLayersObservableCollection<T>,而不是T

我不清楚为什么你需要演员。您可以将cOnecTwo作为参数传递给该方法,并使用更清晰的代码。我敢打赌Class1Class2在某种程度上是相关的,所以他们可能会共享一个公共基类或接口,你可以创建参数ObservableCollection<IBaseClass>