Convert Object Array to another type array using Reflection

12,209

Solution 1

Have you tried this?

var finalType = GetFinalType();
var objArr = GetObjectArray();
var arr = Array.CreateInstance(finalType, objArr.Length);
Array.Copy(objArr, arr, objArr.Length);

That's untested, but it should work. It's more compact and doesn't (really) use reflection.

Solution 2

You are close; does the following work, or was objType a typo?

Type convertTo = GetFinalType();
Object[] objArr = GetObjectArray();
var arr = Array.ConvertAll(objArr,elem=> Convert.ChangeType(elem, convertTo));

Solution 3

I did it the worst way possible but I managed it somehow. I created a new class

public class Tools
{
    public static T[] Convert<T>(object[] objArr)
    {
        IList<T> list = new List<T>();

        foreach (var o in objArr)
        {
            list.Add((T)o);
        }

        return list.ToArray();
    }
}

And where I needed the conversion, I used:

MethodInfo method = typeof(Tools).GetMethod("Convert");
MethodInfo generic = method.MakeGenericMethod(new Type[] { t });

object o = generic.Invoke(null, new object[] { objArr });

var m =  Convert.ChangeType(o,typeof(tArr));

Where

t = typeof(MyClass); 
tArr = typeof(MyClass[]);
Share:
12,209
shake
Author by

shake

Updated on July 24, 2022

Comments

  • shake
    shake almost 2 years

    I have an object array and I want to convert it to a specific type array. I have the type to convert it into which I get at run time. But I am having a problem doing the actual conversion.

    If I use the Convert.ChangeType, I get the error that Object must implement IConvertible

    The Array.ConvertAll is template based and requires that I pass the destination type as a template which I only know at run time. I even tried to do use reflection to call this method but I cannot pass the lambda expression as an argument to the MethodInfo.Invoke method.

    Any Ideas?

    Right I have the following which is not working:

    Type convertTo = GetFinalType();
    Object[] objArr = GetObjectArray();
    var arr = Array.ConvertAll(objArr,elem=> Convert.ChangeType(elem,convertTo));
    
  • shake
    shake over 13 years
    You are absolutely right. This is easier. Thanks for the comment. I should have thought of that a long time ago