Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将泛型ObservableCollection传递给一个方法并对其进行迭代_C#_Generics_Generic List_Generic Method - Fatal编程技术网

C# 将泛型ObservableCollection传递给一个方法并对其进行迭代

C# 将泛型ObservableCollection传递给一个方法并对其进行迭代,c#,generics,generic-list,generic-method,C#,Generics,Generic List,Generic Method,我有两个可观察到的集合,比如说类别1和类别2 private ObservableCollection<Class1> cOne; // collection of objects of type Class1 private ObservableCollection<Class1> cTwo; // collection of objects of type Class2 专用可观测采集锥;//Class1类型的对象集合 私有可观测收集cTwo;//Class2类型的

我有两个可观察到的集合,比如说类别1和类别2

private ObservableCollection<Class1> cOne; // collection of objects of type Class1
private ObservableCollection<Class1> cTwo; // collection of objects of type Class2
专用可观测采集锥;//Class1类型的对象集合
私有可观测收集cTwo;//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;
    }

}
public void MyMethod(){
var listOfLayers=新的ObservableCollection();
if(typeof(T)=typeof(Class1))
{
层列表=(T)圆锥体;
}
否则{
层列表=(T)cTwo;
}
foreach(listOfLayers中的var条目){
WL entry.someprop;
}
}
但每次关于类型转换时,它都会给我带来错误

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


请注意,我没有基于类型创建两个方法,因为这两个方法在单独的数据库表中基本上做相同的事情。因此,它们都将包含重复的代码。

您可能应该强制转换为
ObservableCollection
,而不是简单地转换为
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;
    }
}
public void MyMethod(){
var listOfLayers=新的ObservableCollection();
if(typeof(T)=typeof(Class1))
{
listOfLayers=(可观测采集)圆锥体;
}
否则{
listOfLayers=(ObservableCollection)cTwo;
}
foreach(listOfLayers中的var条目){
WL entry.someprop;
}
}
作为一个侧节点,您的代码看起来有点奇怪。这也可能是因为您简化了示例以证明您的观点,但:
cOne
已经是正确的类型,那么您为什么要强制转换它呢


如果要使用
T
typesafe的方法,最好为要支持的每个
observateCollection
创建一个自己的方法,这样就不必传递类型来执行它。我猜您也希望为不同的
T
执行不同的逻辑,因此拆分这将是有意义的指向类型为
ObservableCollection
的对象,这就是您得到错误的原因。这意味着圆锥应该被投射到可观察的集合上,你的投射方式是不正确的。它应该是
listOfLayers=
(ObservableCollection)cOne
,因为
listOfLayers
ObservableCollection
,而不是
T



我不清楚你为什么需要演员。您只需将
cOne
cTwo
作为参数传递给该方法,就可以获得更干净的代码。我打赌
Class1
Class2
在某种程度上是相关的,因此它们可能共享一个共同的基类或接口,并且您可以使用参数
observetecollection

感谢Florian给出的精彩回答。我做了建议的更改,但是它仍然抛出相同的错误:“System.Collections.ObjectModel.ObservableCollection”到“System.Collections.ObjectModel.ObservableCollection”。我想我最好现在创建两个独立的方法,但是它们将包含或多或少相同的代码。您确定此异常不会发生在else分支中吗?那么可能是
typeof(T)!=类型(调整)‌​IT.Landbase)
?请注意,您不能强制转换为基本类型(因此,如果
T
AdjustIT.Landbase
的父类,则强制转换将失败),请参见以下答案:Class1和Class2是实际模型类。它们表示数据库表。我尝试转换的方法基本上是执行一些数据库查询并初始化ObservableCollection。