首先,我正在努力实现的目标 - 我发现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
上看到任何适合该法案的方法。
答案 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
的后续调用将告诉您该特定维度的大小。