GeoffM
GeoffM

Reputation: 1611

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.

Upvotes: 29

Views: 148353

Answers (6)

Ravi Makwana
Ravi Makwana

Reputation: 2918

Just in My case I need to define data type IEnumerable<string>

var myList = anArray as IEnumerable<string>;

Upvotes: 1

Hardeep Singh
Hardeep Singh

Reputation: 866

Simply Try This

 string[] arr = ((IEnumerable)yourOjbect).Cast<object>()
                             .Select(x => x.ToString())
                             .ToArray();

Upvotes: 14

Daniel Hilgarth
Daniel Hilgarth

Reputation: 174309

Try to cast to IEnumerable. This is the most basic interface all enumerables, arrays, lists etc. implement.

IEnumerable myList = anArray as IEnumerable;
if (myList != null)
{
    foreach (object element in myList)
    {
        // ... do something
    }
}
else
{
    // it's not an array, list, ...
}

Upvotes: 18

ChrisWue
ChrisWue

Reputation: 19020

You should be able to cast it to IEnumerable if it is a collection of any sorts (array, list, etc.). Also PropertyInfo contains a PropertyType property which you could use to find out the actual type if you wanted to.

Upvotes: 1

Rik
Rik

Reputation: 29243

Try this:

    var myList = anArray as IEnumerable;
    if (mylist != null)
    { 
        foreach (var element in myList)
        {
            // etc
        }
    }

You might also need to specify the generic type of the IEnumerable, depending on your situation.

Upvotes: 1

MattDavey
MattDavey

Reputation: 9017

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...
    }
}

Upvotes: 52

Related Questions