我正在检查。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()));