Feedback

C# - Anonymen Typ erstellen, verwenden und casten

Veröffentlicht von am 16.01.2014
(0 Bewertungen)
In .NET ist es möglich so genannte anonyme Typen zu erstellen. Diese Typen haben, wie der Name es bereits sagt, keine Namen. Diese kann man praktisch bei LINQ-Ausdrücken und Datenbindungen einsetzen. Dieses Snippet zeigt einige grundlegende Beispiele zur Verwendung von anonymen Typen.

Erstellen
Beim erstellen schreibt man einfach new und in geschweiften Klammern dahinter die verschiedenen Eigenschaften. Der Compiler erkennt selbstständig, von welchem Typ die Eigenschaften sind.
Um das zurück gegebene Objekt zu speichern bieten sich die Schlüsselwörter dynamic oder var an.

Rückgabe von LINQ
Auch bei LINQ kann man problemlos Anonyme Typen zurück geben. Wichtig ist nur, das die Typen alle gleich lauten. Siehe Vergleichen.
Ein IEnumerable<dynamic> kann man problemlos in andere IEnumerable<T> casten. Das muss aber über eine Select-Abfrage (o.ä.) laufen.

Abfrage
Um eine Eigenschaft eines anonymen Typs abzufragen gehen Sie wie bei normalen Typen vor. Das funktioniert aber nur, wenn das Objekt als dynamic vorliegt. Das var-Schlüsselwort schließt automatisch auf dynamic.

Vergleichen
Anonyme Typen kann man auch vergleichen. Dazu müssen diese aber als Gleich gelten. Dafür ist es erforderlich, das alle Eigenschaften gleich heißen und vom selben Typ sind. Dann werden mit der Standardvergleichsmethode (Equals-Methode) die einzelnen Eigenschaften vergleichen.

Cast from Object to dynamic
Es kommt sicherlich einige male vor, das man nur ein Object erhält. Ob nun durch Schnittstellen oder durch Eigenschaften wie "Tag". Dazu kann man einfach das Objekt casten.

Exceptions
Es kann durch "ercastete" Objekte keine richtige Prüfung durch geführt werden, ob die EIgenschaften auch existieren. Sollten die EIgenschaften nicht existieren, wird eine RuntimeBinderException geworfen.


Benötigte Namespaces
Unterschiedliche, je nach verwendeten Typen. Anonyme Typen selbst benötigen keine speziellen Namespaces. Lediglich Schnittstellen und Klassen liegen teilweise in anderen NS.
Snippet in VB übersetzen
//Erstellen
var dyna1 = new { Id = 12, Name = "Tom" };
dynamic dyna2 = new { Id = 12, Name = "Tom" };

//Rückgabe von LINQ
var arr = new string[]{"i", "it","ite","item","item ", "item 1"};//Array zum testen
IEnumerable<dynamic> list = from item in arr
                            select new { Value = item, CharCount = item.Length };
IEnumerable<string> list2 = list.Select(x => (string)x.Value);//Eigenschaft auswählen und Auflistung casten

//Abfrage
Console.WriteLine(dyna1.Id);
Console.WriteLine(dyna1.Name);

//Vergleichen
bool b1 = dyna1 == dyna2;

//Cast from Object to dynamic
object obj = new { Id = 12, Name = "Test" };
dynamic d = (dynamic)obj;
Console.WriteLine(d.Id);
Console.WriteLine(d.Name);

//Exceptions
Console.WriteLine(d.InExistent);
Abgelegt unter LINQ, dynamic, anonym, var, cast, IEnumerable, Generic.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!