In C# 3.0 ist es möglich zu bestimmen, ob eine Instanz Type
einen anonymen Typ darstellt?Ermitteln, ob ein Typ ein anonymer Typ ist
Antwort
Auch wenn ein anonymer Typ ein gewöhnlicher Typ ist, können Sie einige Heuristik verwenden:
public static class TypeExtension {
public static Boolean IsAnonymousType(this Type type) {
Boolean hasCompilerGeneratedAttribute = type.GetCustomAttributes(typeof(CompilerGeneratedAttribute), false).Count() > 0;
Boolean nameContainsAnonymousType = type.FullName.Contains("AnonymousType");
Boolean isAnonymousType = hasCompilerGeneratedAttribute && nameContainsAnonymousType;
return isAnonymousType;
}
}
Eine weitere gute Heuristik verwendet werden soll, wenn der Klassenname ein gültiger C# Name (anonymer Typ ist mit nicht erzeugt gültige C# -Klassennamen - verwenden Sie dafür einen regulären Ausdruck.
+ 1 Schöne Antwort. –
@Philip aber nicht narrensicher, siehe diese Frage. –
@MattWarren, welche Frage? –
In Methadata und CLR gibt es keine Begriffe wie anonyme Typen. Anonyme Typen sind ausschließlich Compiler.
Vielleicht hilfreich zu wissen, warum Sie das wissen möchten. Wenn Sie die folgenden ausführen:
var myType = new { Name = "Bill" };
Console.Write(myType.GetType().Name );
... Sie sehen würden, so etwas wie „<> f__AnonymousType0`1“ Ausgabe als Typnamen. Abhängig von Ihren Anforderungen können Sie möglicherweise davon ausgehen, dass ein Typ, der mit <> beginnt und "AnonymousType" enthält, und ein Backquote-Zeichen das ist, wonach Sie suchen.
Mach dir keine Sorgen, warum. Es ist Neugier :) – xyz
Ich dachte das gleiche, aber es ist ein bisschen schmutzig. Was ist, wenn sie den Namen in C# 5 ändern? Jeder Code, der es verwendet, wird gebrochen. –
Es ist wichtig zu fragen und zu erklären, "warum", denn oft gibt es andere mögliche Antworten, die aus der Frage nicht ersichtlich sind, ohne mehr zu wissen. –
Es scheint anonyme Typen erhalten Sie eine DebuggerDisplayAttribute
legte sie auf Type = "<Anonymous Type>"
.
Edit: Aber nur, wenn Sie im Debug-Modus kompilieren. Verdammt.
In Release-Build auch? –
Es gibt kein C# -Sprachkonstrukt, mit dem Sie sagen können "Ist das ein anonymer Typ". Sie können eine einfache Heuristik verwenden, um zu approximieren, ob ein Typ ein anonymer Typ ist, aber es ist möglich, von Leuten, die IL codieren, ausgetrickst zu werden oder eine Sprache zu verwenden, in der Zeichen wie > und < in Bezeichnern gültig sind.
public static class TypeExtensions {
public static bool IsAnonymousType(this Type t) {
var name = t.Name;
if (name.Length < 3) {
return false;
}
return name[0] == '<'
&& name[1] == '>'
&& name.IndexOf("AnonymousType", StringComparison.Ordinal) > 0;
}
Eigenschaften eines anonymen typisierten Objekt
- hat einen Namensraum gleich 0
- Basistyp System.Object
- IsSealed = true
- benutzerdefinierte Attribute auf null ist DebuggerDisplayAttribute, Typ : ""
- IsPublic = false
Für meine spezielle Anwendung, wenn der Namespace NULL ist, kann daraus geschlossen werden, dass der Typ anonym ist, also überprüfen, dass der Namespace NULL ist wahrscheinlich die günstigste Prüfung.
Vielen Dank für den Rückgabetyp.NameSpace == null; verbessert die Verarbeitung meiner Programme um fast 50% (war mit diesem Ansatz: http://stackoverflow.com/questions/2483023/how-to-test-if-a-type-anonymous) – Schalk
Yeah. Dies sollte die richtige Antwort sein. Ich denke nicht, dass irgendeine vernünftige konkrete Klasse jemals einen Null-Namespace haben würde. –
+1 danke! Hier meinen Kommentar hinterlassen, um diese Antwort zu favorisieren (nicht nur ein Thread) –
- 1. Kann ein anonymer Typ von einem anderen Typ erben?
- 2. Ermitteln, ob das Objekt ein bestimmter Typ ist oder sich von einem bestimmten Typ ableitet.
- 3. Referenz anonymer Typ Eigenschaften
- 4. Überprüfen, ob ein Typ eine Karte ist
- 5. Ermitteln, ob Struktur hat ein Mitglied von bestimmten Typ
- 6. Ungültiger anonymer Typ member declarator - Anonymer Typ + Nullable-Operator
- 7. Anonymer Typ und Tupel
- 8. anonymer Typ und mehrere Eigenschaften
- 9. Ist es möglich zu bestimmen, ob ein Typ ein Aufzählungs-Typ ist?
- 10. Prüfung, ob ein Typ ein Funktionstyp in Idris ist
- 11. Erkennen, ob ein Typ ein std :: tuple ist?
- 12. Kann ein anonymer Typ mit LINQ abgefragt werden?
- 13. Ermitteln, ob ein Element ein Formularfeld ist
- 14. von generischem Typ ermitteln Typ Ableitung
- 15. Wie kann ich feststellen, ob System.Type ein benutzerdefinierter Typ oder ein Framework-Typ ist?
- 16. Wie erkennen, ob Typ Ein weiterer Allgemein Typ
- 17. Ein Wörterbuch, in dem Wert ein anonymer Typ in C# ist
- 18. Was ist ein Stereo-Typ
- 19. Ist selectedIndexes ein Array-Typ?
- 20. Ermitteln, ob Typ eine Unterklasse eines generischen Typs ist
- 21. TSQL Ermitteln, ob der Parameter vom Typ Struktur ist
- 22. programmatisch ermitteln generischen Typ
- 23. Überprüfen Sie, ob ein Typ eine Schnittstelle ist.
- 24. Wie überprüft man, ob ein generischer Swift-Typ Void ist?
- 25. Wie überprüft man, ob ein Zustandsobjekt vom Typ ICollection ist
- 26. Wie erkennt man, ob ein Typ eine benutzerdefinierte Struktur ist?
- 27. Überprüfen Sie, ob java.lang.reflect.Field Typ ein Byte-Array ist
- 28. C++ - Wissen, ob ein Typ/Klasse verschachtelt ist?
- 29. fest, ob Typ-Wörterbuch ist
- 30. Detach ein anonymer Eventhandler
Siehe auch: http://stackoverflow.com/a/315186/46039 –