.NET反射-将数组类型属性值转换为逗号分隔的字符串

.NET反射-将数组类型属性值转换为逗号分隔的字符串,.net,arrays,reflection,.net,Arrays,Reflection,我正在检查.NET对象,使用反射将它们转储到日志中 我遇到了一个障碍-如果属性是数组类型怎么办?我确实得到了该属性的PropertyInfo结构,我可以看到该属性是一个数组,甚至可以得到该数组属性的值: if(propertyInfo.PropertyType.IsArray) { var value = propertyInfo.GetValue(myObject, null); } 但现在我被卡住了。当我在Visual Studio调试器中查看时,它显示为int[3]-因此VS知道

我正在检查.NET对象,使用反射将它们转储到日志中

我遇到了一个障碍-如果属性是数组类型怎么办?我确实得到了该属性的
PropertyInfo
结构,我可以看到该属性是一个数组,甚至可以得到该数组属性的值:

if(propertyInfo.PropertyType.IsArray)
{
    var value = propertyInfo.GetValue(myObject, null);
}
但现在我被卡住了。当我在Visual Studio调试器中查看时,它显示为
int[3]
-因此VS知道它是一个由三个整数组成的数组-但是现在如何将其转换为表示这三个整数的逗号分隔字符串呢

我试过这样的方法

string.Join(", ", value);
还有其他-但我一直在努力解决
是“动态的”这一事实,例如,它可以是
int[]
十进制[]
甚至其他东西-因此我无法静态键入它。。。。如果我没有输入,那么
string.Join()
会返回奇怪的结果(肯定不是我想要的结果…)

有没有什么聪明的方法可以将这个“某物数组”转换成逗号分隔的字符串,而不需要大量的
if(…)
else{…}
子句


不知何故,我现在在这里的大脑冻结-任何想法解冻冻结将是最受欢迎的

看来解决这个问题最简单的方法就是将其转换为
IEnumerable
。像这样:

if(propertyInfo.PropertyType.IsArray)
{
    var values = (IEnumerable)propertyInfo.GetValue(myObject, null);
    var stringValue = string.Join(", ", values.OfType<object>());
}

这是最简单的解决方案,适用于所有类型的集合,包括数组(
IEnumerable
是我们能想到的最不常见的基础):


string.Join(“,”,((IEnumerable)value).Cast().Select(i=>i.ToString())

var stringValue=string.Join(“,”,(object[])值)
将为所有值类型数组(如
int[]
double[]
等)提供InvalidCastException@bitbonk您是对的,我忽略了指定它只对引用类型有效。
PropertyType.IsArray
PropertyType.IsValueType
永远不会同时为
true
,因此,第二个检查是多余的。+1很好的解决方案-但是,在第二个示例中,VS在类型
下划红色下划线,并提到无法解析符号“of type”@marc_s第一个解决方案捕获所有内容(或bitbok)。第二种解决方案将提供一些边际性能提升,因为您将铸造整个阵列,而不是阵列中的每个项目。为了完整起见,我主要想把它包括在我的答案中。
if(propertyInfo.PropertyType.IsArray)
{
    var values = (IEnumerable)propertyInfo.GetValue(myObject, null);
    var elementType = propertyInfo.PropertyType.GetElementType();
    if (elementType != null && !elementType.IsValueType)
    {
        var stringValue = string.Join(", ", (object[])values);
    }
    else
    {
        var stringValue = string.Join(", ", values.OfType<object>());
    }
}