C# object to array
Asked Answered
J

6

29

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.

Johnie answered 22/6, 2011 at 9:56 Comment(2)
you can find out the type of object from instance.GetType() and you can compare it with desirebale type using is, e.g. if (instance.GetType() is IEnumerable)Evangelical
@Bad Display Name that's now how the is keyword works, what you're doing there is attempting to cast from System.Type to System.Collection.IEnumerable, which doesn't work since System.Type doesn't implement that interface. perhaps you meant typeof(IEnumerable).IsAssignableFrom(instance.GetType())Eutrophic
E
52

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...
    }
}
Eutrophic answered 22/6, 2011 at 10:0 Comment(2)
matt... is that you?! It's Marlon.... anyway, this doesn't work, IEnumerable needs a type parameter (maybe this was possible on an old version of .NET)Siltstone
@Cloud: Not correct. There is IEnumerable and IEnumerable<T>Burier
B
18

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, ...
}
Burier answered 22/6, 2011 at 9:59 Comment(3)
No - it needs a type parameter, this doesn't workSiltstone
@Cloud: Not correct. There is IEnumerable and IEnumerable<T>Burier
If you do get the "Using generic type 'IEnumerable<T>' requires 1 type arguments" error, then you need to use the System.Collections namespace, that is where the IEnumerable definition is. IEnumerable<T> lives in System.Collections.GenericSalzman
T
14

Simply Try This

 string[] arr = ((IEnumerable)yourOjbect).Cast<object>()
                             .Select(x => x.ToString())
                             .ToArray();
Tolan answered 6/7, 2017 at 10:9 Comment(1)
This is the simplest way if it is primitive type.Burhans
C
1

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.

Cider answered 22/6, 2011 at 10:1 Comment(0)
W
1

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.

Wivern answered 22/6, 2011 at 10:1 Comment(0)
P
1

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

var myList = anArray as IEnumerable<string>;
Pontianak answered 7/7, 2022 at 7:59 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.