Determinare se un tipo è un tipo anonimo [duplicato]
-
22-07-2019 - |
Domanda
Questa domanda ha già una risposta qui:
In C # 3.0, è possibile determinare se un'istanza di Type
rappresenta un tipo anonimo?
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.