Конвертировать массив объектов в массив другого типа с помощью Reflection - PullRequest
7 голосов
/ 03 декабря 2010

У меня есть массив объектов, и я хочу преобразовать его в массив определенного типа. У меня есть тип, чтобы преобразовать его в который я получаю во время выполнения. Но у меня возникла проблема с фактическим преобразованием.

Если я использую Convert.ChangeType, я получаю ошибку, что Object должен реализовать IConvertible

Array.ConvertAll основан на шаблонах и требует, чтобы я передавал тип назначения в качестве шаблона, который я знаю только во время выполнения. Я даже пытался использовать рефлексию для вызова этого метода, но я не могу передать лямбда-выражение в качестве аргумента методу MethodInfo.Invoke.

Есть идеи?

Правильно, у меня есть следующее, которое не работает:

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

Ответы [ 5 ]

15 голосов
/ 01 февраля 2011

Вы пробовали это?

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

Это не проверено, но должно работать. Он более компактен и (на самом деле) не использует отражения.

1 голос
/ 03 декабря 2010

Я сделал это наихудшим способом, но мне как-то удалось. Я создал новый класс

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();
    }
}

И где мне нужно было преобразование, я использовал:

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));

Где

t = typeof(MyClass); 
tArr = typeof(MyClass[]);
1 голос
/ 03 декабря 2010

Вы рядом; работает ли следующее или objType опечатка?

Type convertTo = GetFinalType();
Object[] objArr = GetObjectArray();
var arr = Array.ConvertAll(objArr,elem=> Convert.ChangeType(elem, convertTo));
0 голосов
/ 12 сентября 2017

Это решение, которое сработало для меня:

public static T[] CastArrayToType<T>(object[] collection)
{
    return Array.ConvertAll<object, T>(
        collection,
        delegate(object prop)
        {
            return (T)prop;
        }
    );
}
0 голосов
/ 03 декабря 2010

Код не выполняется, потому что какой-то объект в вашем массиве не является примитивным типом или не реализует интерфейс IConvertible. Вы не можете использовать Convert.ChangeType() для таких объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...