Voglio avere una funzione che restituisca "Base" se una variabile della classe Base
è stata passata ad essa, "Derivata" se è stata dichiarata come Derived
, ecc. Non dipende dal tipo di runtime di un valore a cui è stato assegnato.Come sapere nel codice C# che viene dichiarata una variabile con
risposta
Vedere il codice seguente per esempio. La chiave è usare Generics, il metodo di estensione è stato usato solo per una bella sintassi.
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);
}
}
Risultato:
ICollection
IEnumerable
IList`1
List`1
EDIT: Si può anche evitare l'uso di metodo di estensione qui, in quanto causerebbe che appaia sul ogni IntelliSense elenco a discesa. Vedere un altro esempio:
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);
}
}
produce anche risultati corretti.
Basta recitare su GetType() finché non si colpisce oggetto.
Sì, l'ho fatto, ha funzionato, ma lentamente. – Misha
Questo non è possibile senza analizzare il codice in questione.
In fase di esecuzione solo due pezzi di informazione tipo sono disponibili, l'effettiva tipo di un valore (via object.GetType()) e, se la variabile in questione è un parametro o una classe/variable esempio la proprietà FieldType sulla un FieldInfo, PropertyType su un oggetto PropertyInfo o ParameterType su un oggetto Parameter.
Poiché il valore passato a voi potrebbe essere arrivato tramite più variabili sul suo percorso, la domanda non è nemmeno ben definita, temo.
Ah - Vedo che vuoi solo il tipo come attualmente definito nel metodo, la funzionalità Espressione fornirà questo (la risposta di Roman mostra un modo pulito per farlo) ma fai attenzione a provare a usare questo al di fuori del metodo ... In Essenzialmente stai lasciando che l'inferenza di tipo generico del compilatore inferisca il tipo in questione ma questo significa che la variabile utilizzata è non sempre la variabile che puoi vedere. Può invece essere quella di una variabile compilatore sintetizzato, per esempio:
string x = "x";
Console.WriteLine(x.GetDeclaredType()); // string
Console.WriteLine(((object)x).GetDeclaredType()); // object
Poiché il compilatore sintetizza una variabile temporanea in cui inserire un riferimento oggetto x.
+1, btw, effettivo è definito come "concreto" tipo ... –
Non ero interessato a un valore, solo il nome di tipo la variabile è stata dichiarata con ... Grazie comunque, informazioni utili. – Misha
+1 per i tuoi avvisi –
- 1. C Valore # viene dichiarata ma mai usato
- 2. Utilizzo di KILL con una variabile dichiarata
- 3. Posso rendere una variabile finale dopo che è stata dichiarata?
- 4. Come accedere variabile dichiarata all'interno promessa nel AngularJS
- 5. Come sapere in quale ambiente viene eseguito il codice?
- 6. Ottenere il tipo di una variabile nel codice C
- 7. Clojure: Determina se una variabile è dichiarata
- 8. C++ che dichiara una variabile gestita in un codice nativo
- 9. Perché una variabile deve essere dichiarata una variabile globale prima che venga assegnata?
- 10. In C, cosa significa quando una variabile viene dichiarata tra un'intestazione e un corpo di una funzione?
- 11. Variabile non dichiarata nell'oggetto predefinito costruito nel costruttore
- 12. come chiamare una variabile nel codice dietro alla pagina aspx
- 13. Impossibile usare la variabile locale prima che venga dichiarata
- 14. Come rilevare che il codice C# Windows Form viene eseguito in Visual Studio?
- 15. Come invertire una DLL nel codice C++?
- 16. Compiler lamentando variabile non dichiarata in una macro
- 17. variabile Actionscript dichiarata come * (asterisco) digito
- 18. Variabile non dichiarata con LESS @import. Che cosa sta causando questo? C'è una soluzione?
- 19. Come posso "disinserire" una classe che è stata dichiarata
- 20. Quando una variabile viene dichiarata in una stored procedure T-SQL, viene mantenuta in memoria o tempdb?
- 21. Uscita codice C variabile
- 22. Come leggere una variabile CMake in codice sorgente C++
- 23. Assegnazione inline variabile globale con operatore di dichiarazione/assegnazione combinato e un'altra variabile non dichiarata che perde l'ambito?
- 24. Utilizzo della variabile appena dichiarata nell'inizializzazione (int x = x + 1)?
- 25. Come posso sapere se una variabile VARCHAR contiene una sottostringa?
- 26. Convenzioni codice JavaScript - dichiarazione variabile
- 27. PHP Come sapere se una variabile è un riferimento?
- 28. Come trovare il file .js dove viene dichiarata una determinata funzione js (da Chrome)?
- 29. Perché questo codice C viene compilato?
- 30. Una variabile di blocco deve essere dichiarata volatile?
Se si utilizza la seconda soluzione di Romani, perché non usare semplicemente "typeof (T)"? –
@Courtney: non è possibile scrivere 'string s = null; Console.Write (typeof (s)); ', perché s non è un nome di tipo o spazio dei nomi. Non verrà compilato. –