C# 将泛型ObservableCollection传递给一个方法并对其进行迭代
我有两个可观察到的集合,比如说类别1和类别2C# 将泛型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类型的
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。