我有一个ObservableCollection接口数组,它们包含不同的相关类型:
public IObsColD[] dsLists = new IObsColD[]
{
new ObsColD<DSection>(),
new ObsColD<DSection4>(),
new ObsColD<DSection5>()
};
public interface IObsColD { }
public class ObsColD<T> : ObservableCollection<T>, IObsColD where T : new()
{
public ObsColD() { }
public ObsColD(int n = 0)
{
for (int i = 0; i < n; i++)
this.Add(new T());
}
}
然后在程序的某处我将dsLists [2](DSection5类型变量的ObservableCollection)分配给参数p,使用p作为函数f的参数,在f中我尝试做一个foreach。
但是我需要知道p的类型才能重新铸造。 或者:我需要知道ObsCol是否是DSection5或DSection4类型变量的集合。
如何找出当时p项的类型?
答案 0 :(得分:0)
您的p
类型为IObsColD
,而不是ObservableCollection
,因此foreach只有在您的界面实现IEnumerable
时才有效。
如果您的DSection
类具有公共基类或接口,则可以IObsColD
实施IEnumerable<DSectionBase>
并从那里开始工作。
答案 1 :(得分:0)
is
关键字和as
关键字应该有所帮助。
这是一些示例实现,用于检查传递给f
方法的参数是ObsColD<DSection5>
还是ObsColD<DSection4>
。检查完毕后,您可以安全地将col
参数转换为适当的集合。
public void MyMethod()
{
var p = this.dsLists[2];
this.f(p);
}
private void f(IObsColD col)
{
if (col is ObsColD<DSection5>)
{
foreach (var item in (ObsColD<DSection5>)col)
{
}
}
else if (col is ObsColD<DSection4>)
{
foreach (var item in (ObsColD<DSection4>)col)
{
}
}
}
使用as
实现:使用关键字强制转换。如果强制转换不正确,则会导致归零,否则会转换为预期类型。然后检查null:
private void f(IObsColD col)
{
var ds5 = col as ObsColD<DSection5>;
var ds4 = col as ObsColD<DSection4>;
if (ds5 != null)
{
foreach (var item in ds5)
{
}
}
else if (ds4 != null)
{
foreach (var item in ds4)
{
}
}
}