获得仅提供泛型类型的多维数组大小

时间:2013-11-18 16:19:20

标签: c# .net reflection

首先,我正在努力实现的目标 - 我发现Roslyn提供的C#交互式窗口非常有用。其中一个更有趣的功能是它可以采用任何IEnumerable并以人类可读的形式打印出其内容。

例如,输入:

  

var a = new [,] {{3,4},{5,6}};一个

将打印:

  

int [2,2] {{3,4},{5,6}}

我正在尝试在IEnumerable上的我自己的扩展方法中复制此行为(用于调试目的)。打印元素本身很容易,我遇到的麻烦是如何获得仅给出IEnumerable<T>的数组维度。

这是我到目前为止获取类型名称和大小的原因:

private static String getFormattedTypeName<T>(IEnumerable<T> enumerable)
{            
    var enumerableType = enumerable.GetType();

    var typeNameAndSize = new StringBuilder();
    typeNameAndSize.Append(enumerableType.Name.Split('`').First());

    var genericArguments = enumerableType.GetGenericArguments();
    if (genericArguments.Length != 0)
    {
        typeNameAndSize.Append(String.Format("<{0}> ({1})", 
            String.Join(",", genericArguments.Select(t => t.Name)),
            enumerable.Count()));
    }
    else if (enumerableType.IsArray)
    {
        //Can I get the length of each array dimension from the type???
    }

    return typeNameAndSize.ToString();
}

我的问题是获得我的评论所指出的多维数组维度的最佳方法是什么?我没有在Type上看到任何适合该法案的方法。

1 个答案:

答案 0 :(得分:3)

如果您通过Array检查知道自己正在使用IsArray,则可以将enumerable转换为Array并获取数组边界,如下所示:

private static Int32[] GetArrayBounds(Array value)
{
    var bounds = new Int32[value.Rank];
    for (var i = 0; i < value.Rank; i++)
        bounds[i] = value.GetLength(i);

    return bounds;
}

Rank告诉您数组中维度的数量,然后对给定维度的GetLength的后续调用将告诉您该特定维度的大小。