查找ObservableCollection项的类型

时间:2015-05-17 11:49:29

标签: c# casting

我有一个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项的类型?

2 个答案:

答案 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)
        {

        }
    }
}