Search code examples
c#arraysreflectioncollectionscasting

C# object to array


Using reflection I have an object which I need to cast into an iterable list of items (type unknown, will be object). Using the Watch window I can see my object is an array of some type as it tells me the number of elements and I can explode the tree view to see the elements themselves.

Firstly, I need to check that the object passed is some kind of array (might be List, might be object[], etc). Then I need to iterate through that array. However, I can't do the type conversion.

Here's how I'm using it (abbreviated):

    private static void Example(object instance, PropertyInfo propInfo)
    {
        object anArray = propInfo.GetValue(instance, null);
        ArrayList myList = anArray as ArrayList;
        foreach (object element in myList)
        {
            // etc
        }
    }

I've tried various different casts. The above doesn't raise an exception but mylist is null when anArray actually exists and contains items. The actual instance being saved is a strongly-typed List<> but could take a limited subset of forms if necessary. But the point of the exercise is that this Example() method doesn't know the basic type of the property.


Solution

  • Casting it to an ArrayList is only going to work if the object actually is an ArrayList. It wont work with a System.Array, or a System.Collections.Generic.List`1 for example.

    I think what you actually should do is cast it to IEnumerable, since that is your only requirement to loop over it...

    object anArray = propInfo.GetValue(instance, null);
    IEnumerable enumerable = anArray as IEnumerable;
    if (enumerable != null)
    {
        foreach(object element in enumerable)
        {
            // etc...
        }
    }