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

88

这个可以正常工作:

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

但是如果我不想将expectedType设置为typeof(string[]),我该如何检查值是否为字符串数组?我想要做的事情类似于:

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

这可行吗?


1
你想知道对象是否被声明为string[],或者一个对象[]是否仅包含某种类型的实例吗? - Chris Marasti-Georg
7个回答

143

使用 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))

22

您可以使用扩展方法(不是必须的,但可以使代码更加易读):

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

然后使用:

Console.WriteLine(new string[0].GetType().IsArrayOf<string>());

7
value.GetType().GetElementType() == typeof(string)

作为额外的奖励(但我不确定。这是我使用的代码...)
var ienum = value.GetType().GetInterface("IEnumerable`1");

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

通过这个,你可以查找List、IEnumerable等,并获取T。

7

我发现最简洁和安全的方法是使用MakeArrayType

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

0

这是另一个样本,

using System;
using System.Collections.Generic;

public static class Program
{
    public static void Main()
    {
        Type type = typeof(string[]);
        // string[], int[], char[], List<MyData>, IList<MyData>, IEnumarable<MyData>  =====> console write "True",
        // string, int, MyData etc ==== does not write 
        
        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IList<>))
        {
            Type itemType = type.GetGenericArguments()[0];
            Console.WriteLine("True");
        }

        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
        {
            Type itemType = type.GetGenericArguments()[0];
            Console.WriteLine("True");
        }

        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>))
        {
            Type itemType = type.GetGenericArguments()[0];
            Console.WriteLine("True");
        }
        
        if (type.IsArray)
        {
            Console.WriteLine("True");
        }       
    }
}

public class MyData
{
    public string Name { get; set; }
}

-3
你实际上需要知道数组的类型吗?还是只需要元素是某种特定类型?
如果是后者,你可以简单地过滤出符合你要求的元素:
string[] strings = array.OfType<string>();

-7
if(objVal.GetType().Name == "Object[]")

数组为真


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接