6

如果我知道某个泛型类型参数是一个数组,我如何将它转换为一个数组或一个IEnumerable以便我可以看到它的项目?例如

public class Foo<T>
{
  public T Value { get; set; }

  public void Print()
  {
    if (Value.GetType().IsArray)
      foreach (var item in Value /*How do I cast this to Array or IEnumerable*/)
        Console.WriteLine(item);
  }
}
4

3 回答 3

8

尝试这样的事情:

public void Print()
{
    var array = Value as Array;
    if (array != null)
        foreach (var item in array)
            Console.WriteLine(item);
}

as关键字:

as 运算符类似于强制转换操作。但是,如果无法进行转换,则 as 返回 null 而不是引发异常。

于 2013-03-29T14:17:39.610 回答
3

或者你可以限制你的类型参数

public class Foo<T> where T : IEnumerable
{
  public T Value { get; set; }

  public void Print()
  {
      foreach (var item in Value)
        Console.WriteLine(item);
  }
}
于 2013-03-29T14:22:57.437 回答
2

尝试

foreach (var item in (object []) Value)

但是,由于您只能利用可以枚举的事实,因此Value您可能更喜欢

var e = Value as IEnumerable;
if (e == null) return;
foreach (var item in e) Console.WriteLine (item);

这改进了封装,并且在您切换时无需更改代码,例如从数组切换到列表。

于 2013-03-29T14:17:26.130 回答