我有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;
请注意,我还没有基于类型创建两个方法,因为这两种方法基本上都会在不同的数据库表中执行相同的操作。因此他们都会包含重复的代码。
答案 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
,因为listOfLayers
是ObservableCollection<T>
,而不是T
。
我不清楚为什么你需要演员。您可以将cOne
和cTwo
作为参数传递给该方法,并使用更清晰的代码。我敢打赌Class1
和Class2
在某种程度上是相关的,所以他们可能会共享一个公共基类或接口,你可以创建参数ObservableCollection<IBaseClass>
。