2010-12-02 14 views
5

Ich habe ein Objekt-Array und ich möchte es in ein Array des spezifischen Typs konvertieren. Ich habe den Typ in den ich es zur Laufzeit umwandeln kann. Aber ich habe ein Problem mit der tatsächlichen Konvertierung.Objekt Array in ein anderes Array mit Reflection konvertieren

Wenn ich die Convert.ChangeType verwenden, erhalte ich die Fehlermeldung, dass Object IConvertible implementieren muss

Die Array.ConvertAll ist Vorlage basiert und erfordert, dass ich den Zieltyp als Vorlage übergeben, die ich nur zur Laufzeit kennen . Ich habe sogar versucht, Reflektion zu verwenden, um diese Methode aufzurufen, aber ich kann den Lambda-Ausdruck nicht als Argument für die MethodInfo.Invoke-Methode übergeben.

Irgendwelche Ideen?

Recht habe ich die folgende, die nicht funktionieren:

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

Wie ist das Wird eine Ausnahme ausgelöst? –

+0

@Mark: * "Ich bekomme den Fehler, dass Objekt IConvertible implementieren muss" * – cdhowie

+0

Die Zeile var arr = Array.ConvertAll (objArr, elem => Convert.ChangeType (elem, convertTo)); kompiliert nicht, da es den Zieltyp als Vorlage benötigt, z. B. Array.ConvertAll (objArr, elem => Convert.ChangeType (elem, convertTo)); .. Ich habe nur T2 zur Laufzeit – shake

Antwort

11

Haben Sie versucht das?

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

Das ist nicht getestet, aber es sollte funktionieren. Es ist kompakter und verwendet (wirklich) keine Reflexion.

+0

Sie haben absolut Recht. Das ist einfacher. Danke für den Kommentar. Daran hätte ich schon lange denken müssen – shake

1

Sie in der Nähe; funktioniert die folgende Arbeit, oder war objType ein Tippfehler?

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

Es tut uns leid es war ein Tippfehler – shake

0

Der Code schlägt fehl, weil ein Objekt in Ihrem Array nicht ein primitiver Typ ist, oder ist nicht etwas, das die IConvertible Schnittstelle implementiert Sie nicht Convert.ChangeType() auf solche Objekte verwenden können.

1

Ich habe es auf die schlechteste Weise gemacht, aber irgendwie habe ich es geschafft. Ich habe eine neue Klasse

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

Und wo ich die Konvertierung benötigt, habe ich:

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

Wo

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

Dies ist eine Lösung, die für mich gearbeitet: „nicht funktioniert“

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