2016-05-17 2 views
0

Ich versuche, ein Objekt für die Serialisierung zu initialisieren, das Klassenobjekt wurde mit xsd.exe erstellt. Die einzelne Eigenschaften können ohne Probleme initialisiert werden, aber beim Versuch, eine ‚unbeschränkte‘ XSD-Eigenschaft initialisieren kann ich nicht eine foreach-Schleife über jeden Wert in einem Array gehen und das zu dem Objekt hinzufügen:Ungültiger Ausdrucksterm 'foreach'

 object[] test = new object[0]; 

     test[0] = "ring"; 

     export export = new export(); 

     export.info = new exportInfo 
     { 
      dateandtimeofexport = DateTime.Now, 
      duration = "10", 
      planningsoftware = new exportInfoPlanningsoftware 
      { 
       name = "", 
       major = "", 
       minor = "", 
       revision = "", 
       build = "" 
      }, 
      exporter = new exportInfoExporter 
      { 
       version = new exportInfoExporterVersion 
       { 
        name = "", 
        major = "", 
        minor = "", 
        revision = "", 
        build = "" 
       }, 
       module = new exportInfoExporterModule[] 
       { 
        foreach(Object x in test) 
        { 
        new exportInfoExporterModule{name = x.name, major = x.major, minor = x.minor, revision = x.revision, build = x.build;} 
        } 
       } 
      } 
     }; 

I denke, das Hauptproblem hier ist mein Verständnis von genau, wie man ein Array von Objekten unter der Objektklasse, die von meinem XSD mit XSD.exe erstellt wurde, zu initialisieren, kann jemand beraten, wie dies ohne die foreach-Schleife getan werden könnte?

Jede Anleitung wird sehr geschätzt.

Antwort

-1

Um eine Foreach verwenden zu können, müssen Sie auf einen Container iterieren, der die Schnittstelle IEnumerable implementiert.

Es ist nicht der Fall eines einfachen Arrays. Einfach den Test in eine Liste umwandeln (List implementiert IEnumerable) und es sollte funktionieren.

List<object> test = new List<object>(); 
+0

Oder noch kürzer 'foreach (Objekt x in test.ToList())' –

+2

Einfache Arrays können mit 'foreach' sicher iteriert werden. Es ist erstaunlich, nicht auf eine gute Art, dass diese Antwort zwei Upvotes bekam. Das Problem des OP besteht darin, dass 'foreach' in einem Array-Initialisierer nicht erlaubt ist,' = new exportInfoExporterModule [] {...} ', nicht dass' foreach' Arrays nicht unterstützt. – GSerg

+0

Danke Jungs, aber das Problem hier ist, dass foreach nicht verwendet werden kann whatsover im Kontext gezeigt. Es scheint nur die zugrunde liegende Klassenstruktur (erstellt von xsd.exe) verwendet werden und keine Operationen sind in dieser Objektinitialisierung möglich. –

1

Die ersten beiden Zeilen des Codes werden in einer Laufzeitausnahme führen, wie Sie einen Wert in einem Null-Länge-Array zu setzen sind versucht.

object[] test = new object[0]; 
test[0] = "ring"; 

Laufzeitausnahme (Zeile -1): Index außerhalb der Grenzen des Arrays war.

Hier ist eine .NET Fiddle zu zeigen, dass.

Iterieren über ein Array über eine foreach ist völlig in Ordnung! Aber das Problem ist, dass die Schleife in einem Objektinitialisierer ist. Dies ist nicht zulässig. Verwenden Sie stattdessen Linq mit .Select und .ToArray().

module = test.Select(t => new exportInfoExporterModule { name = t }) 
      .ToArray(); 
3
module = test.Select(t => new exportInfoExporterModule{name = t}).ToArray() 

statt

module = new exportInfoExporterModule[] 
      { 
       foreach(Object x in test) 
       { 
       new exportInfoExporterModule{name = x} 
       } 
      } 

sollte es tun. Erfahren Sie etwas LINQ bei es wird klar, was hier passiert ist;)

5

Ihr Code ist nicht gültig C#. Sie können foreach nicht in einem Arrayinitialisierer verwenden.

// NOT VALID C# CODE! 
module = new exportInfoExporterModule[] 
{ 
    foreach(Object x in test) 
    { 
     new exportInfoExporterModule{name = x} 
    } 
} 

Dies ist nicht möglich, weil foreach eine Aussage ist, aber das Array intializer erwartet ein Ausdruck, die in einem exportInfoExportedModule führt.

Was können Sie stattdessen tun, ist so etwas wie dieses:

module = test.Select(x => new exportInfoExporterModule{name = x}).ToArray() 

Aber beachten Sie, die Sie am Anfang Ihres Codes das Array test mit Länge erstellen 0 und dann versuchen, "ring" als gesetzt seine erste (zero) Elemente! Das gibt eine IndexOutOfRangeException. Initialisieren test wie folgt aus:

object[] test = new object[] {"ring"}; 
3

Sie nicht eine Schleife innerhalb einer Initialisierer verwenden können.

Sehen Sie, wenn Sie das Array nach initialisieren können Sie den Rest des Objekts aufgebaut haben:

export.info = new exportInfo 
{ 
     // ... 
     version = new exportInfoExporterVersion 
     { 
      name = "", 
      major = "", 
      minor = "", 
      revision = "", 
      build = "" 
     } 
    } 
}; 

export.info.exporter.module = new exportInfoExporterModule[test.Length]; 

for (int i = 0; i < test.Length; i++) 
{ 
    export.info.exporter.module[i] = new exportInfoExporterModule 
    { 
     name = test[i].name, 
     major = test[i].major, 
     minor = test[i].minor, 
     build = test[i].build, 
     revision = test[i].revision 
    }; 
} 

Oder mit LINQ:

export.info = new exportInfo 
{ 
     // ... 
     version = new exportInfoExporterVersion 
     { 
      name = "", 
      major = "", 
      minor = "", 
      revision = "", 
      build = "" 
     }, 
     module = test.Select(x => new exportInfoExporterModule 
     { 
      name = x.name, 
      major = x.major, 
      minor = x.minor, 
      build = x.build, 
      revision = x.revision 
     }).ToArray() 
    } 
}; 
+0

Danke BoltClock, ich bin sehr neu und stolpere ein bisschen herum. Das sieht nach der Lösung aus, aber bevor ich LINQ weiter lese, könntest du darüber beraten, wie ich die LINQ-Methode verwenden kann, um ein neues exportInfoExporterModul zu erstellen, wobei exportInfoExporterModule nicht nur 'name' sondern 'name, version, major, minor' hat? –

+0

@Dan Hall: So wie Sie eine neue exportInfoExporterVersion erstellt haben, müssen Sie natürlich x zu den tatsächlichen Werten ändern, die Sie serialisieren. Möglicherweise möchten Sie Ihre Frage so bearbeiten, dass sie die tatsächlichen Objekte enthält, die serialisiert werden, sodass wir einige konkretere Daten haben, mit denen wir arbeiten können. – BoltClock

+0

danke, ich habe den Code in meiner Frage leicht aktualisiert, um zu zeigen, was ich versuche zu versuchen. Was ich nicht verstehe, ist mit dem LINQ-Beispiel, was bedeutet das x? Ich frage mich, wie dieses Beispiel erweitert werden kann, um ein exportInfoExporterModule-Objekt mit den anderen Eigenschaften zu erstellen. –

0

Sie haben das Array erstellen Sie Möchten Sie zuweisen, bevor Sie Ihr Export-Objekt erstellen.

Eine andere Möglichkeit könnte sein, Linq zu verwenden, um Module zuzuordnen. Etwas wie module = test.Select(x => new exportInfoExporterModule{name = x}).ToArray() sollte funktionieren.