2011-03-11 191 views
47

這工作得很好:如何檢查對象是否是某種類型的數組?

var expectedType = typeof(string); 
object value = "..."; 
if (value.GetType().IsAssignableFrom(expectedType)) 
{ 
    ... 
} 

但是我怎麼檢查是否值是不設置expectedTypetypeof(string[])一個字符串數組?我想做類似的事情:

var expectedType = typeof(string); 
object value = new[] {"...", "---"}; 
if (value.GetType().IsArrayOf(expectedType)) // <--- 
{ 
    ... 
} 

這可能嗎?

+1

是否想知道對象是否聲明爲字符串[]。或者如果一個對象[]僅包含某種類型的實例? – 2011-03-11 15:34:26

回答

81

使用Type.IsArrayType.GetElementType()檢查數組的元素類型。

Type valueType = value.GetType(); 
if (valueType.IsArray && expectedType.IsAssignableFrom(valueType.GetElementType()) 
{ 
... 
} 

當心Type.IsAssignableFrom()。如果你想檢查類型是否匹配,你應該檢查是否相等(typeA == typeB)。如果你想檢查一個給定類型爲類型本身或子類(或接口),那麼你應該使用Type.IsAssignableFrom()

typeof(BaseClass).IsAssignableFrom(typeof(ExpectedSubclass)) 
-1

你確實需要知道數組的類型?或者你只需​​要元素是某種類型的?

如果是後者,你可以簡單地僅過濾就是你想要的元素:

string[] strings = array.OfType<string>(); 
15

可以使用擴展方法(不是說你有,但使它更具可讀性):

public static class TypeExtensions 
{ 
    public static bool IsArrayOf<T>(this Type type) 
    { 
     return type == typeof (T[]); 
    } 
} 

然後用:

Console.WriteLine(new string[0].GetType().IsArrayOf<string>()); 
3
value.GetType().GetElementType() == typeof(string) 

作爲額外的獎勵(但我不是100%確定。這是我使用的代碼...)

var ienum = value.GetType().GetInterface("IEnumerable`1"); 

if (ienum != null) { 
    var baseTypeForIEnum = ienum.GetGenericArguments()[0] 
} 

這個你可以看看名單,IEnumerable的......並獲得T.

+15

這是一個有風險的魔法字符串 – 2012-11-17 11:16:06

5

最整潔和安全的方式做到這一點是找到正在使用MakeArrayType

var expectedType = typeof(string); 
object value = new[] {"...", "---"}; 
if (value.GetType() == expectedType.MakeArrayType()) 
{ 
    ... 
} 
相關問題