.net 如何识别表示SZ-Array的System.Type示例?

vybvopom  于 2023-04-13  发布在  .NET
关注(0)|答案(3)|浏览(170)

CLR使用不同的System.Type示例来表示SZ数组(单维,零基,又名向量)和非零基数组(即使它们是一维的)。我需要一个函数,它接受System.Type的示例并识别它是否表示SZ数组。我能够使用GetArrayRank()方法检查秩,但是不知道怎么检查它是零基的。请大家帮帮忙好吗?

using System;

class Program
{
    static void Main()
    {
        var type1 = typeof (int[]);
        var type2 = Array.CreateInstance(typeof (int), new[] {1}, new[] {1}).GetType();

        Console.WriteLine(type1 == type2); // False

        Console.WriteLine(IsSingleDimensionalZeroBasedArray(type1));  // True
        Console.WriteLine(IsSingleDimensionalZeroBasedArray(type2)); //  This should be False
    }

    static bool IsSingleDimensionalZeroBasedArray(Type type)
    {
        // How do I fix this implementation?
        return type != null && type.IsArray && type.GetArrayRank() == 1;
    }
}
vyu0f0g1

vyu0f0g11#

static bool IsSingleDimensionalZeroBasedArray(Type type)
{
    return type != null && type.IsArray && type == type.GetElementType().MakeArrayType();
}
bnl4lu3b

bnl4lu3b2#

比上面的更快,不涉及类型系统,只使用类型的名称

public static bool IsSzArray( this Type type ) {
    if ( type != null && type.IsArray ) {
        string name = type.Name;
        int len = name.Length;

        return len > 2 && name[ len - 2 ] == '[';
    }
    return false;
}
sh7euo9m

sh7euo9m3#

对于那些使用.NET Core 2.0或更高版本(包括“新的”.NET 5或更高版本)的人,System.Type现在有一个更方便的IsSZArray property来为你做这件事。所以问题的代码可以重写:

static bool IsSingleDimensionalZeroBasedArray(Type type)
{
    return type?.IsSZArray ?? false;
}

相关问题