Frage

Ich habe ein Dictionary(TKey, TValue) wie

Dictionary<int, ArrayList> Deduction_Employees = 
    new Dictionary<int, ArrayList>();

und später füge ich zu dieser Array-Liste einen anonymen Typ wie dieser

var day_and_type = new {
    TheDay = myDay,
    EntranceOrExit = isEntranceDelay
};

Deduction_Employees[Employee_ID].Add(day_and_type);

Nun, wie kann ich unbox dass var und Zugang jene Eigenschaften ??

War es hilfreich?

Lösung

Zuerst Sie Unboxing nicht den Typ. Anonyme Typen sind Referenztypen, nicht Strukturen.

Auch wenn Sie technisch Instanzen des gleichen Typs außerhalb des Verfahrens erstellen können sie in deklariert wurden (gemäß Abschnitt 7.5.10.6 der C # 3.0-Sprachspezifikation, in dem es heißt:

  

Im Rahmen des gleichen Programms, zwei anonyme   Objektinitialisierer angeben, dass ein   Folge von Eigenschaften der gleichen   Namen und Kompilierung-Typen in der   Reihenfolge wird Instanzen erzeugen   der gleiche anonyme Typ.

) Sie haben keine Möglichkeit des Erhaltens der name von der Art, die Sie benötigen, um die Besetzung von Object zurück auf die Art auszuführen Sie erstellt. Sie müßten einen Guss-by-Beispiel Lösung greifen, die von Natur aus fehlerhaft ist.

Cast-by-Beispiel fehlerhaft ist, weil von einem Design-Standpunkt, jeder einzelne Ort der Typ außerhalb der Funktion zugreifen möchten sie deklariert ist (und noch im selben Modul), müssen Sie effektiv die Art erklären alle immer wieder .

Es ist eine Verdoppelung der Anstrengungen, die führt zu schlampig Design und Implementierung.

Wenn Sie .NET 4.0 verwenden, dann Sie könnte legen Sie die Objektinstanz in einer dynamischen Variable. Allerdings ist der größte Nachteil der fehlenden Kompilierung-Überprüfung der Mitgliedszugang. Sie könnten leicht misspell den Namen des Mitglieds, und dann haben Sie einen Laufzeitfehler statt einem Fehler bei der Kompilierung.

Letztlich , wenn Sie die Notwendigkeit, finden einen anonymen Typ außerhalb der Methode zu verwenden, um es in deklariert wird, dann ist die einzige gute Lösung ist es, einen konkreten Typ erstellen und ersetzen Sie den anonymen Typ für den konkreten Typ .

Andere Tipps

Es gibt mehrere Möglichkeiten.

Da die Kommentare scheint darauf hinzudeuten, dass ich vorschlagen, dass Sie dies tun, lassen Sie mich mache deutlich:. Sie sollten einen benannten Typen für Ihr Objekt erschaffen, da Sie beabsichtigen, um es zu übergeben

Erstens können Sie verwenden, Spiegelung, die eine andere Antwort hier bereits hingewiesen.

Ein andere Möglichkeit, die Tricks .NET in Ihnen, die richtige Art zu geben als „Guss Beispiel vorangehen“ bekannt sind, und es geht in etwa so: Sie müssen Ihre Aufgabe durch einen generischen Methodenaufruf zu übergeben, das das Objekt zurück als die richtige Art, durch die richtige Art zu Rückkehr folgern.

Zum Beispiel, versuchen Sie dies:

private static T CastByExample<T>(T example, object value)
{
    return (T)value;
}

und es zu benutzen:

var x = CastByExample(new { TheDay = ??, EntranceOrExit = ?? }, obj);

für die beiden ?? Flecken, müssen Sie nur etwas Einpassen der Datentyp für diese Eigenschaften passieren, werden die Werte nicht verwendet werden.

Dies nutzt die Tatsache, dass mehrere anonyme Typen exakt die gleichen Eigenschaften, des gleichen Typs enthält, in der gleichen Reihenfolge, in der gleichen Baugruppe wird auf den gleichen einzigen Typ zugeordnet werden.

Doch bis zu diesem Zeitpunkt sollten Sie stattdessen einen benannten Typen sein zu schaffen.

  

Ein anonymer Typ hat Methode Umfang. Um einen anonymen Typ, oder eine Sammlung übergeben, die anonyme Typen enthält, außerhalb einer Methode Grenze, müssen Sie werfen zunächst die Art zu Objekt. Dies ist jedoch besiegt die starke Typisierung des anonymen Typs. Wenn Sie Ihre Abfrage-Ergebnisse speichern müssen oder sie außerhalb der Methode Grenze passieren, sollten Sie mit einem normalen namens Struktur oder Klasse anstelle eines anonymen Typs.

Quelle: http://msdn.microsoft.com/en-us /library/bb397696.aspx

Nein kann man nicht. Sie können nur die Eigenschaften zugreifen, indem mithilfe von Reflektion. Der Compiler hat keine Möglichkeit zu wissen, was der Typ war, und da es ein anonymer Typ ist, können Sie werfen es nicht.

Wenn Sie mit .NET 1.x -. 3.x, müssen Sie Reflektion verwenden

Wenn Sie .NET 4.0 verwenden, können Sie einen dynamischen Typ verwenden und die erwarteten Eigenschaften nennen.

In keinem Fall tun Sie unbox müssen; das ist für Werttypen. Anonyme Typen sind immer Referenztypen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top