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



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

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

if(propertyInfo.PropertyType.IsArray)
{
    var value = propertyInfo.GetValue(myObject, null);
}

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

我尝试了

string.Join(", ", value);

和其他-但我总是与value是"动态"的事实作斗争,例如,它可能是int[]decimal[]甚至其他东西-所以我不能静态地键入它....如果我不输入它,那么string.Join()返回奇怪的结果(绝对不是我要找的…)

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

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

似乎围绕这个问题最简单的方法是将其转换为IEnumerable<object>。这样的:

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

虽然,由于c#中的数组协方差,如果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>());
    }
}

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

string.Join(", ", ((IEnumerable)value).Cast<object>().Select(i => i.ToString()));

相关内容

  • 没有找到相关文章