2009-10-30 17 views

Antwort

35

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

+ 1 Schöne Antwort. –

+0

@Philip aber nicht narrensicher, siehe diese Frage. –

+1

@MattWarren, welche Frage? –

2

In Methadata und CLR gibt es keine Begriffe wie anonyme Typen. Anonyme Typen sind ausschließlich Compiler.

1

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.

+0

Mach dir keine Sorgen, warum. Es ist Neugier :) – xyz

+0

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. –

+0

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. –

1

Es scheint anonyme Typen erhalten Sie eine DebuggerDisplayAttribute legte sie auf Type = "<Anonymous Type>".

Edit: Aber nur, wenn Sie im Debug-Modus kompilieren. Verdammt.

+0

In Release-Build auch? –

5

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; 
} 
14

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.

+1

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

+0

Yeah. Dies sollte die richtige Antwort sein. Ich denke nicht, dass irgendeine vernünftige konkrete Klasse jemals einen Null-Namespace haben würde. –

+0

+1 danke! Hier meinen Kommentar hinterlassen, um diese Antwort zu favorisieren (nicht nur ein Thread) –

Verwandte Themen