如何检查对象是否是某种类型的数组?

All*_*est 61 .net c# arrays reflection types

这很好用:

var expectedType = typeof(string);
object value = "...";
if (value.GetType().IsAssignableFrom(expectedType))
{
     ...
}
Run Code Online (Sandbox Code Playgroud)

但我怎么检查是否值是不设置一个字符串数组expectedTypetypeof(string[])?我想做的事情如下:

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

这可能吗?

Ste*_*fan 108

使用Type.IsArrayType.GetElementType()来检查数组的元素类型.

Type valueType = value.GetType();
if (valueType.IsArray && expectedType.IsAssignableFrom(valueType.GetElementType())
{
 ...
}
Run Code Online (Sandbox Code Playgroud)

注意Type.IsAssignableFrom().如果要检查完全匹配的类型,则应检查是否等于(typeA == typeB).如果要检查给定类型是类型本身还是子类(或接口),那么您应该使用Type.IsAssignableFrom():

typeof(BaseClass).IsAssignableFrom(typeof(ExpectedSubclass))
Run Code Online (Sandbox Code Playgroud)


Ali*_*tad 15

您可以使用扩展方法(不是必须的,但使其更具可读性):

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

然后使用:

Console.WriteLine(new string[0].GetType().IsArrayOf<string>());
Run Code Online (Sandbox Code Playgroud)


Nat*_*txo 6

发现它的最新和最安全的方法是使用MakeArrayType:

var expectedType = typeof(string);
object value = new[] {"...", "---"};
if (value.GetType() == expectedType.MakeArrayType())
{
     ...
}
Run Code Online (Sandbox Code Playgroud)


xan*_*tos 5

value.GetType().GetElementType() == typeof(string)
Run Code Online (Sandbox Code Playgroud)

作为额外的奖励(但是我不确定100%。这是我使用的代码...)

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

if (ienum != null) {
    var baseTypeForIEnum = ienum.GetGenericArguments()[0]
}
Run Code Online (Sandbox Code Playgroud)

有了它,您可以查找List,IEnumerable ...并获取T。

  • 那是一根危险的魔术绳 (18认同)