Reputation: 1611
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
Reputation: 2918
Just in My case I need to define data type IEnumerable<string>
var myList = anArray as IEnumerable<string>;
Upvotes: 1
Reputation: 866
Simply Try This
string[] arr = ((IEnumerable)yourOjbect).Cast<object>()
.Select(x => x.ToString())
.ToArray();
Upvotes: 14
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
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
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
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