I am inspecting .NET objects using reflection to dump them to a log.
I've hit a snag - what if a property is an array type? I do get the PropertyInfo
structure for that property, and I can see that the property is an array, and I can even get the value of that array property:
if(propertyInfo.PropertyType.IsArray)
{
var value = propertyInfo.GetValue(myObject, null);
}
but now I'm stuck. When I look in the Visual Studio debugger, it shows as int[3]
- so VS knows it's an array of three integers - but how can I convert this to a comma-separated string representing these three integers now?
I tried things like
string.Join(", ", value);
and others - but I'm always struggling with the fact that value
is "dynamic", e.g. it could be a int[]
or a decimal[]
or even something else - so I cannot statically type it.... and if I don't type it, then the string.Join()
returns strange results (definitely not what I'm looking for...)
Is there any clever way to convert this "array of something" to a comma-separated string without a lot of if(...)
and else { .... }
clauses??
Somehow I'm in a brain-freeze here right now - any ideas to thaw this freeze up would be most welcome!
Well it seems like the easiest way around this problem would be to convert it to an IEnumerable<object>
. Like this:
if(propertyInfo.PropertyType.IsArray)
{
var values = (IEnumerable)propertyInfo.GetValue(myObject, null);
var stringValue = string.Join(", ", values.OfType<object>());
}
Although, because of array covariance in c#, if values
is an array of a reference type, it should be castable to object[]
. For this case, you could use this instead:
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>());
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With