Domanda

    

Questa domanda ha già una risposta qui:

         

In C # 3.0, è possibile determinare se un'istanza di Type rappresenta un tipo anonimo?

È stato utile?

Soluzione

Anche se un tipo anonimo è un tipo normale, puoi usare alcune euristiche:

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

Un altro buon metodo euristico da utilizzare è se il nome della classe è un nome C # valido (i tipi anonimi vengono generati senza nomi di classe C # validi - usare un'espressione regolare per questo).

Altri suggerimenti

Proprietà di un oggetto tipizzato anonimo

  • ha uno spazio dei nomi uguale a null
  • tipo di base di System.Object
  • IsSealed = true
  • l'attributo personalizzato 0 è DebuggerDisplayAttribute, tipo: " "
  • IsPublic = false

Per la mia particolare applicazione, se lo spazio dei nomi è null, si può dedurre che il tipo è anonimo, quindi controllare che lo spazio dei nomi sia null è probabilmente il controllo meno costoso.

Non esiste un costrutto in linguaggio C # che ti permetta di dire " È un tipo anonimo " ;. È possibile utilizzare una semplice euristica per approssimare se un tipo è un tipo anonimo, ma è possibile farsi ingannare dalla mano delle persone che codifica IL, o usando una lingua in cui caratteri come & Gt; e < sono validi negli identificatori.

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

In metadati e CLR non esistono termini come tipi anonimi. I tipi anonimi sono esclusivamente funzionalità del compilatore.

Potrebbe essere utile sapere perché vuoi saperlo. Se si esegue quanto segue:

var myType = new { Name = "Bill" };
Console.Write( myType.GetType().Name  );

... vedresti qualcosa come " < > f__AnonymousType0`1 " output come nome del tipo. A seconda delle esigenze, potresti essere in grado di supporre che un tipo che inizia con & Lt; & Gt ;, contenente & Quot; AnonymousType & Quot; e un carattere di citazione posteriore è quello che stai cercando.

Sembra che i tipi anonimi siano DebuggerDisplayAttribute messi su dove Type = "<Anonymous Type>".

Modifica: ma solo quando compili in modalità Debug. Darn.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top