2010-12-02 8 views
5

J'ai un tableau d'objets et je souhaite le convertir en un tableau de types spécifique. J'ai le type pour le convertir dans lequel je reçois à l'exécution. Mais j'ai un problème en faisant la conversion réelle.Convertir un tableau d'objets en un autre tableau de types à l'aide de Reflection

Si je le Convert.ChangeType, je reçois l'erreur que l'objet doit mettre en œuvre IConvertible

Le Array.ConvertAll est modèle basé et exige que je passe le type de destination en tant que modèle que je ne sais au moment de l'exécution . J'ai même essayé d'utiliser la réflexion pour appeler cette méthode mais je ne peux pas passer l'expression lambda comme argument à la méthode MethodInfo.Invoke.

Des idées?

droite je donne les résultats suivants qui ne fonctionne pas:

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

Comment est-ce Une exception est-elle levée? –

+0

@Mark: * "J'obtiens l'erreur que l'objet doit implémenter IConvertible" * – cdhowie

+0

La ligne var arr = Array.ConvertAll (objArr, elem => Convert.ChangeType (elem, convertTo)); ne compile pas car il a besoin du type cible en tant que modèle, par exemple Array.ConvertAll (objArr, elem => Convert.ChangeType (elem, convertTo)); .. Je n'ai que T2 à l'exécution – shake

Répondre

11

Avez-vous essayé?

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

Cela n'a pas été testé, mais cela devrait fonctionner. C'est plus compact et n'utilise pas (vraiment) de réflexion.

+0

Vous avez absolument raison. C'est plus facile. Merci pour le commentaire. J'aurais dû y penser il y a longtemps – shake

1

Vous êtes à proximité; fait le travail suivant, ou était objType une faute de frappe?

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

Désolé, c'était une faute de frappe – shake

0

Le code échoue car un objet dans votre tableau n'est pas un type primitif, ou n'est pas quelque chose qui implémente l'interface IConvertible Vous ne pouvez pas utiliser Convert.ChangeType() sur de tels objets.

1

Je l'ai fait de la pire façon possible mais je l'ai géré en quelque sorte. J'ai créé une nouvelle classe

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

Et là où je devais la conversion, je:

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[]); 
0

C'est une solution qui a fonctionné pour moi: "ne fonctionne pas"

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