2010-08-05 4 views
30

Ich kann nicht herausfinden, wie diese Arbeit zu machen:Wie erstelle ich ein C# -Array mit Reflection und gebe nur Informationen ein?

object x = new Int32[7]; 
Type t = x.GetType(); 

// now forget about x, and just use t from here. 

// attempt1 
object y1 = Activator.CreateInstance(t); // fails with exception 

// attempt2 
object y2 = Array.CreateInstance(t, 7); // creates an array of type Int32[][] ! wrong 

Was ist das Geheimnis Sauce? Ich kann das zweite machen, wenn ich den Typ der Elemente des Arrays bekommen kann, aber ich habe das auch nicht herausgefunden.

+3

Sie hatten mich bei "geheime Soße". =) –

Antwort

30

Nur um Jons Antwort hinzuzufügen. Der Grund, warum Versuch 1 fehlschlägt, liegt darin, dass es keinen Standardkonstruktor für Int32[] gibt. Sie müssen eine Länge angeben. Wenn Sie die Überladung verwenden, die ein Array von Argumenten dauert, wird es funktionieren:

// attempt1 
object y1 = Activator.CreateInstance(t, new object[] { 1 }); // Length 1 
+3

Beide Antworten bringen mich aus der Gurke, aber ich denke, das ist die elegantere Methode. Ich hätte diese Antwort nicht erraten, aber ich sehe, wie es notwendig ist, dem Konstruktor eines Arrays ein Argument zu liefern, weil die Länge des Arrays nicht Teil des Typs ist. –

+0

Habe dies und den Chunk von http://stackoverflow.com/a/20052747/561690 verwendet, um eine Deep Copy-Implementierung zu aktivieren, die Arrays verarbeitet - wahrscheinlich nicht der beste Weg, um es zu tun, aber es funktioniert für mich! Vielen Dank! –

+0

Simpler: Activator.CreateInstance (t, 1) –

41

Sie Type.GetElementType() müssen die Nicht-Array-Typ zu erhalten:

object x = new Int32[7]; 
Type t = x.GetType(); 
object y = Array.CreateInstance(t.GetElementType(), 7); 

Alternativ, wenn Sie den Typ des Elements direkt zu bekommen, verwenden Sie das:

Type t = typeof(int); 
object y = Array.CreateInstance(t, 7); 

Grundsätzlich muss Array.CreateInstance die Elementtyp des zu erstellenden Arrays, nicht der endgültige Array-Typ.

+0

Das beantwortet nicht, warum es nicht mit // versuch1 funktioniert, was mich ziemlich neugierig macht (da // versuch2 funktioniert). – zebediah49

+0

Wenige Sekunden nachdem ich meine Frage gepostet habe, habe ich GetElementType() entdeckt, und so habe ich es implementiert. Mein Ziel war es, ein TreeView-abgeleitetes Widget zu erstellen, mit dem Sie jede Struktur (mit beliebigen Feldern, einschließlich Arrays, Primaten und mehr Strukturen) werfen und das Ganze anzeigen und bearbeiten lassen und Ihnen eine Kopie des bearbeitete Struktur –

Verwandte Themen