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

mar*_*c_s 5 .net arrays reflection

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

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

if(propertyInfo.PropertyType.IsArray)
{
    var value = propertyInfo.GetValue(myObject, null);
}
Run Code Online (Sandbox Code Playgroud)

但现在我被卡住了.当我查看Visual Studio调试器时,它显示为int[3]- 所以VS知道它是一个包含三个整数的数组 - 但是如何将它转换为逗号分隔的字符串,表示现在这三个整数?

我尝试过类似的东西

string.Join(", ", value);
Run Code Online (Sandbox Code Playgroud)

和其他人 - 但我总是在努力应对value"动态" 的事实,例如它可能是一个int[]或一个decimal[]甚至是别的东西 - 所以我不能静态地输入它......如果我不输入它,那么在string.Join()返回奇怪的结果(绝对不是我要找的......)

是否有任何聪明的方法将这个"数组的东西"转换为逗号分隔的字符串,而没有很多if(...)else { .... }子句?

不知何故,我现在正处于大脑冻结状态 - 任何解冻这种冻结的想法都会受到欢迎!

p.s*_*w.g 6

好吧,似乎解决这个问题的最简单方法是将其转换为IEnumerable<object>.像这样:

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

虽然,由于c#中数组协方差,if values是一个引用类型的数组,它应该可以转换为object[].对于这种情况,您可以使用此代替:

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>());
    }
}
Run Code Online (Sandbox Code Playgroud)