In C# 3.0, è possibile determinare se un'istanza di Type
rappresenta un tipo anonimo?determinare se un tipo è un tipo anonimo
risposta
Anche se un tipo anonimo è un tipo ordinario, è possibile utilizzare 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'altra buona euristica da usare è se il nome della classe è un nome valido C# (tipo anonimo vengono generati senza nomi di classi C# validi: usa l'espressione regolare per questo).
+ 1 Bella risposta. –
@Philip ma non infallibile, vedi questa domanda. –
@MattWarren, quale domanda? –
In methadata e CLR non c'è termini quali tipi anonimi. I tipi anonimi sono solo funzionalità del compilatore.
Potrebbe essere utile sapere perché lo vuoi sapere. Se si esegue il seguente:
var myType = new { Name = "Bill" };
Console.Write(myType.GetType().Name );
... si dovrebbe vedere qualcosa di simile a "<> f__AnonymousType0`1" uscita come il nome del tipo. A seconda delle tue esigenze, potresti essere in grado di supporre che un tipo che inizia con <>, contenente "AnonymousType" e un carattere di citazione posteriore sia quello che stai cercando.
Non ti preoccupare perché. È curiosità :) – xyz
Ho pensato la stessa cosa, ma è un po 'sporca. Cosa succede se cambiano il nome in C# 5? Qualsiasi codice che lo utilizza sarà rotto. –
È importante chiedere e spiegare "perché" perché spesso ci sono altre possibili risposte che potrebbero non essere evidenti dalla domanda senza saperne di più. –
Sembra che i tipi anonimi ottengano un DebuggerDisplayAttribute
inserito in corrispondenza di Type = "<Anonymous Type>"
.
Modifica: ma solo quando si compila in modalità debug. Darn.
Anche in versione build? –
Non c'è linguaggio C# costrutto che permette di dire "E 'questo un tipo anonimo". È possibile utilizzare un'euristica semplice per approssimare se un tipo è un tipo anonimo, ma è possibile essere ingannato dall'IL di codifica manuale di persone o utilizzare una lingua in cui tali caratteri come > 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;
}
proprietà di un oggetto tipizzato anonimo
- ha uno spazio dei nomi uguale a null
- tipo di base System.Object
- IsSealed = true
- attributo personalizzato 0 è DebuggerDisplayAttribute, Tipo : ""
- IsPublic = false
Per la mia particolare applicazione, se lo spazio dei nomi è nullo si può dedurre che il tipo è anonimo, in modo da verificare che lo spazio dei nomi è nullo è probabilmente il controllo meno costoso.
Grazie, optando per il tipo di ritorno.NomeSpace == null; migliorato l'elaborazione dei miei programmi di quasi il 50% (stava usando questo approccio: http://stackoverflow.com/questions/2483023/how-to-test-if-a-type-is-anonymous) – Schalk
Sì. Questa dovrebbe essere la risposta corretta. Non credo che qualsiasi classe concreta ragionevole abbia mai uno spazio dei nomi nullo. –
+1 grazie! Lasciando qui il mio commento per favorire questa risposta (non solo una discussione) –
- 1. Come determinare se un tipo è un tipo di collezione?
- 2. Determinare se un tipo è statico
- 3. C# - come determinare se un tipo è un numero
- 4. Come determinare se un tipo .NET è una struttura personalizzata?
- 5. Come determinare se System.Type è un tipo personalizzato o un tipo di Framework?
- 6. Determinare se il tipo è dizionario
- 7. Impossibile creare un valore costante di tipo "Tipo anonimo"
- 8. Creazione dinamica di un tipo anonimo?
- 9. Creare un tipo anonimo da reflection ParamInfo []
- 10. Trasmissione a tipo anonimo
- 11. IEqualityComparer per tipo anonimo
- 12. Creare un nuovo elenco tipo anonimo all'unione sul tipo di elenco anonimo
- 13. Tipo anonimo e tupla
- 14. Proprietari di tipo anonimo
- 15. Come determinare se un parametro di tipo è un sottotipo di un tratto?
- 16. Dichiarare un membro di tipo anonimo con un nome semplice
- 17. Controllare se un tipo è una mappa
- 18. Verificare se un tipo è un'interfaccia
- 19. tipo anonimo e più proprietà
- 20. PowerShell: è possibile determinare il tipo MIME di un file?
- 21. Ottenere valore dal tipo anonimo
- 22. come determinare se un oggetto è un certo tipo in F #
- 23. Determinare se type è una sottoclasse di tipo generico
- 24. Perché usare il tipo anonimo funziona e usa un tipo esplicito non in un GroupBy?
- 25. C# determinare tipo generico
- 26. Come posso verificare se un tipo è un sottotipo di un tipo in Python?
- 27. LINQ, utilizzare "variabile" all'interno di un tipo anonimo
- 28. .NET: come determinare se un oggetto è un oggetto COM?
- 29. Aggiungere proprietà a un tipo JavaScript anonimo dopo aver definito?
- 30. Verificare se un determinato tipo è un delegato di azione
vedi anche risposta: http://stackoverflow.com/a/315186/46039 –