Je veux avoir une fonction qui retournerait "Base" si une variable de classe Base
lui était passée, "Dérivée" si elle était déclarée comme Derived
, etc Non selon le type d'exécution d'une valeur à laquelle il a été affecté.Comment savoir en C# code avec lequel une variable a été déclarée avec
Répondre
Voir le code ci-dessous par exemple. La clé est d'utiliser Generics, la méthode d'extension a été utilisée juste pour la syntaxe sympa.
using System;
static class Program
{
public static Type GetDeclaredType<T>(this T obj)
{
return typeof(T);
}
// Demonstrate how GetDeclaredType works
static void Main(string[] args)
{
ICollection iCollection = new List<string>();
IEnumerable iEnumerable = new List<string>();
IList<string> iList = new List<string>();
List<string> list = null;
Type[] types = new Type[]{
iCollection.GetDeclaredType(),
iEnumerable.GetDeclaredType(),
iList.GetDeclaredType(),
list.GetDeclaredType()
};
foreach (Type t in types)
Console.WriteLine(t.Name);
}
}
Résultat:
ICollection
IEnumerable
IList`1
List`1
EDIT: Vous pouvez également éviter d'utiliser la méthode d'extension ici, car il fait paraître sur chaque IntelliSense liste déroulante. Voir un autre exemple:
using System;
using System.Collections;
static class Program
{
public static Type GetDeclaredType<T>(T obj)
{
return typeof(T);
}
static void Main(string[] args)
{
ICollection iCollection = new List<string>();
IEnumerable iEnumerable = new List<string>();
Type[] types = new Type[]{
GetDeclaredType(iCollection),
GetDeclaredType(iEnumerable)
};
foreach (Type t in types)
Console.WriteLine(t.Name);
}
}
produit également des résultats corrects.
Recurve juste sur GetType() jusqu'à ce que vous atteigniez l'objet.
Oui, je l'ai fait, ça a marché mais lentement. – Misha
Ceci n'est pas possible sans analyser le code en question.
Lors de l'exécution seulement deux informations de type sont disponibles, la réelle type d'une valeur (via object.GetType()) et, si la variable en question est un paramètre ou une classe/variable d'instance la propriété sur FieldType un FieldInfo, PropertyType sur un PropertyInfo ou ParameterType sur un ParameterInfo.
Étant donné que la valeur qui vous a été transmise pourrait bien provenir de plusieurs variables sur son chemin vers vous, la question n'est même pas bien définie, j'en ai peur. Ah - Je vois que vous ne voulez que le type actuellement défini dans la méthode, la fonctionnalité Expression vous le fournira (la réponse de Roman montre une bonne façon de le faire) mais méfiez-vous d'essayer de l'utiliser en dehors de la méthode ... essence vous laissez l'inférence de type générique du compilateur inférer le type en question mais cela signifie que la variable utilisée est pas toujours la variable que vous pouvez voir. Il peut au contraire être celle d'une variable synthétisée du compilateur, par exemple:
string x = "x";
Console.WriteLine(x.GetDeclaredType()); // string
Console.WriteLine(((object)x).GetDeclaredType()); // object
Depuis le compilateur synthétisant une variable temporaire dans lequel placer une référence d'objet à x.
+1, btw, réel est appelé type "béton" ... –
Je n'étais pas intéressé par une valeur, seul le nom du type de la variable a été déclaré avec ... Merci quand même, informations utiles. – Misha
+1 pour vos avertissements –
- 1. Comment savoir si une variable dans ASP a été déclarée
- 2. Y at-il un moyen de savoir si une variable a été déclarée en C?
- 3. xsl: comment dire si une variable a été déclarée
- 4. Comment savoir si la variable est déclarée en Python?
- 5. trouver lequel a été cliqué
- 6. Comment savoir si une instruction sql Update a été exécutée avec succès ou a échoué?
- 7. Comment puis-je "annuler" une classe qui a été déclarée
- 8. Comment savoir quel itinéraire a été sélectionné?
- 9. Comment trouver le modèle de thread avec lequel une DLL a été construite?
- 10. Savoir si une propriété est déclarée virtuelle
- 11. SQL Server - Dans la clause avec une variable déclarée
- 12. Comment puis-je savoir quand .Net System.Diagnostics.Process a été exécuté avec succès ou a échoué?
- 13. Comment savoir si une classe a été instanciée
- 14. Comment savoir quelle MKPinAnnotation a été pressée?
- 15. Comment savoir onglet tabulation a été pressé?
- 16. Comment savoir quelle image a été cliquée?
- 17. Comment savoir ce qui a été cliqué?
- 18. Comment puis-je trouver le nom d'utilisateur d'origine avec lequel un processus a été démarré?
- 19. Comment est-il possible d'atteindre une variable à partir d'une expression de bloc de code différente de celle du bloc où la variable a été déclarée?
- 20. Pour savoir si une page * .aspx a été modifiée
- 21. En C, comment puis-je limiter la portée d'une variable globale au fichier dans lequel elle est déclarée?
- 22. Comment savoir si une vue a été déplacée?
- 23. Comment puis-je savoir quand une collection a été modifiée?
- 24. Vérifier si une variable a été définie avec le nom de la valeur d'une autre variable
- 25. MessageWindow - Comment puis-je savoir s'il a été détruit?
- 26. Comment puis-je compiler du code C qui a déjà été pré-traité avec GCC?
- 27. Comment libérer la mémoire qui a été utilisée pour une variable en C?
- 28. Comment vérifier si une variable a été initialisée?
- 29. Comment savoir quel compilateur a été utilisé: g77 ou gfortran
- 30. Comment savoir si la collection itérée a été modifiée?
Si vous utilisez la deuxième solution de Romans, pourquoi ne pas simplement utiliser 'typeof (T)'? –
@Courtney: Vous ne pouvez pas écrire 'string s = null; Console.Write (typeof (s)); ', car s n'est pas un nom de type ou d'espace de nom. Il ne compilera pas. –