2010-12-02 5 views
5

Tengo una matriz de objetos y quiero convertirla en una matriz de tipos específicos. Tengo el tipo para convertirlo en el que obtengo en tiempo de ejecución. Pero estoy teniendo un problema al hacer la conversión real.Convertir matriz de objetos a otra matriz de tipo usando Reflection

Si utilizo el Convert.ChangeType, me sale el error que objeto debe implementar IConvertible

El Array.ConvertAll está basada en plantillas y requiere que me pase el tipo de destino como una plantilla que sólo sé en tiempo de ejecución . Incluso intenté usar el reflejo para llamar a este método, pero no puedo pasar la expresión lambda como argumento al método MethodInfo.Invoke.

¿Alguna idea?

correcto que tiene los siguientes elementos que no está funcionando:

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

¿Cómo es esto ¿Se lanza una excepción? –

+0

@Mark: * "Recibo el error de que Object debe implementar IConvertible" * – cdhowie

+0

La línea var arr = Array.ConvertAll (objArr, elem => Convert.ChangeType (elem, convertTo)); no se compila porque necesita el tipo de destino como plantilla, por ejemplo, Array.ConvertAll (objArr, elem => Convert.ChangeType (elem, convertTo)); .. Solo tengo T2 en tiempo de ejecución – shake

Respuesta

11

¿Has probado esto?

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

Eso no está probado, pero debería funcionar. Es más compacto y no (realmente) utiliza la reflexión.

+0

Tienes toda la razón. Esto es más fácil. Gracias por el comentario. Debería haber pensado en eso hace mucho tiempo – shake

1

Usted está cerca; funciona el siguiente, o fue objType un error tipográfico?

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

Lo siento, fue un error tipográfico – shake

0

El código está fallando debido a algún objeto en su conjunto no es un tipo primitivo, o no es algo que implementa la interfaz IConvertible No puede utilizar Convert.ChangeType() sobre tales objetos.

1

Lo hice de la peor manera posible pero lo logré de alguna manera. He creado una nueva clase

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

Y dónde tenía la conversión, he utilizado:

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

Dónde

t = typeof(MyClass); 
tArr = typeof(MyClass[]); 
0

Esta es una solución que funcionó para mí: "¿no trabajar"

public static T[] CastArrayToType<T>(object[] collection) 
{ 
    return Array.ConvertAll<object, T>(
     collection, 
     delegate(object prop) 
     { 
      return (T)prop; 
     } 
    ); 
} 
Cuestiones relacionadas