2013-03-29 96 views
3

如果我知道某個泛型類型參數是一個數組,那麼如何將其轉換爲數組或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); 
    } 
} 
+0

牛逼可以是任何東西。我正在檢查T是否是一個數組,只有這樣做。我忽略了這個問題,以便將其隔離並快速得到答案。我正在編寫一個XML RPC庫。 –

+0

我明白你的意思了。我的錯!語言blooper。我的意思是,如果*在某種情況下*,我確信T是一個數組,我將如何施放它。我不是說T會永遠是一個數組。 –

+0

啊,在這種情況下,用Yuck的答案。 – Davio

回答

7

嘗試這樣:

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

as關鍵字:

as運算符是像一個轉換操作。但是,如果轉換 不可行,則返回null而不是引發異常。

+4

這個,但我會用'IEnumerable'而不是'Array' – Moho

+0

@Moho改用IEnumerable來代替。我將會保持原樣,但絕對可以這樣做。 – Yuck

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); 

這提高了封裝,使得不必如果切換,例如從數組切換到列表,請更改您的代碼。

3

,或者你可能會限制你的類型參數

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

    public void Print() 
    { 
     foreach (var item in Value) 
     Console.WriteLine(item); 
    } 
} 
+0

這可能是乾淨的做法。 – JohnB

+1

我不能。 T可以是任何東西。這就是爲什麼我首先檢查它是否是一個數組。 –