En C# 3.0, est-il possible de déterminer si une instance de Type
représente un type anonyme?Déterminer si un type est un type anonyme
Répondre
Même si un type anonyme est un type ordinaire, vous pouvez utiliser des heuristiques:
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;
}
}
Une autre bonne heuristique à utiliser est si le nom de classe est un nom valide C# (type anonyme sont générés sans noms de classe C# valides - utilisez une expression régulière pour cela).
+ 1 Bonne réponse. –
@Philip mais pas infaillible, voir cette question. –
@MattWarren, quelle question? –
Dans méthadata et CLR, il n'existe pas de termes tels que les types anonymes. Les types anonymes sont uniquement des fonctionnalités du compilateur.
Peut-être utile de savoir pourquoi vous voulez le savoir. Si vous exécutez la commande suivante:
var myType = new { Name = "Bill" };
Console.Write(myType.GetType().Name );
... vous verriez quelque chose comme « <> f__AnonymousType0`1 » sortie comme le nom du type. Selon vos besoins, vous pouvez supposer qu'un type commençant par <>, contenant "AnonymousType" et un caractère de guillemet arrière est ce que vous cherchez.
Ne vous inquiétez pas pourquoi. C'est de la curiosité :) – xyz
J'ai pensé la même chose, mais c'est un peu sale. Et s'ils changeaient le nom dans C# 5? Tout code qui l'utilise sera cassé. –
Il est important de demander et d'expliquer «pourquoi» parce que souvent il y a d'autres réponses possibles qui peuvent ne pas être évidentes à partir de la question sans en savoir plus. –
Il semble que les types anonymes obtiennent un DebuggerDisplayAttribute
mis sur eux où Type = "<Anonymous Type>"
.
Éditer: Mais seulement lorsque vous compilez en mode débogage. Zut.
Dans la version de construction aussi? –
Il n'y a pas de construction de langage C# qui vous permet de dire "Est-ce un type anonyme". Vous pouvez utiliser une heuristique simple pour estimer si un type est un type anonyme, mais il est possible de se faire piéger par des gens qui codent IL, ou en utilisant un langage où des caractères tels que > et < sont valides dans les identifiants.
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;
}
propriétés d'un objet typé anonyme
- a un espace de noms égal à null type de base
- de System.Object
- IsSealed = true
- attribut personnalisé 0 est DebuggerDisplayAttribute, type : ""
- IsPublic = false
Pour mon application particulière, si l'espace de noms est nul, on peut déduire que le type est anonyme, donc vérifier que l'espace de noms est nul est probablement la vérification la moins chère.
Merci, en optant pour le type de retour. NameSpace == null; amélioré le traitement de mes programmes de près de 50% (utilisait cette approche: http://stackoverflow.com/questions/2483023/how-to-test-if-a-type-is-anonymous) – Schalk
Ouais. Cela devrait être la bonne réponse. Je ne pense pas que n'importe quelle classe concrète raisonnable aurait jamais un espace de noms nul. –
+1 merci! Laissant ici mon commentaire afin de préférer cette réponse (pas seulement un fil) –
- 1. Déterminer si un type est statique
- 2. Déterminer si un type est un type de référence ou un type de valeur
- 3. C# - comment déterminer si un Type est un nombre
- 4. Comment puis-je déterminer si System.Type est un type personnalisé ou un type de cadre?
- 5. Lancer un type anonyme à un type connu
- 6. Comment déterminer si Type est une structure?
- 7. Comment déterminer si un type d'interface implémente un attribut personnalisé
- 8. Linq, utilisez « variable » dans un type anonyme
- 9. Un type anonyme peut-il hériter d'un autre type?
- 10. Comment déterminer si un type implémente un type d'interface générique spécifique
- 11. Linq ToDictionary renvoie un type anonyme
- 12. Déterminer le type proxy
- 13. Comment détecter si le type est un autre type générique
- 14. C# - convertir un type anonyme en observablecollection
- 15. Quelle est la syntaxe pour un type anonyme dans VB?
- 16. C# type anonyme foreach loop
- 17. Déterminer si StructureMap a un type spécifique configuré?
- 18. Génériques et type anonyme
- 19. Détection si un type déclenche
- 20. Comment savoir si une classe Java est un type primitif?
- 21. Convertir un type existant en un type anonyme et ajouter une nouvelle propriété
- 22. Déterminer les interfaces implémentées par un type
- 23. C# -Interview Question Anonyme type
- 24. Comment vérifier si un type est marqué avec un attribut?
- 25. IEqualityComparer pour le type anonyme
- 26. Détecter si le type d'un objet est un type défini par .NET Framework
- 27. VB.Net sérialisation type anonyme xml
- 28. Comment savoir si un PropertyInfo est d'un type enum particulier?
- 29. comment accéder au type anonyme?
- 30. C Type # classe - Comment déterminer si elle est un cadre standard .net classe
Voir aussi la réponse: http://stackoverflow.com/a/315186/46039 –