Wie kann man in C # -Code wissen, mit welchem ​​Typ eine Variable deklariert wurde?

7

Ich möchte eine Funktion haben, die "Base" zurückgibt, wenn eine Variable der Klasse Base an sie übergeben wurde, "Abgeleitet", wenn sie als Derived deklariert wurde usw. Nicht abhängig vom Laufzeittyp eines Wertes es wurde zugewiesen.

    
Misha 23.11.2009, 23:18
quelle

3 Antworten

15

Siehe Code unten zum Beispiel. Der Schlüssel ist, Generics zu verwenden, die Erweiterungsmethode wurde nur für die nette Syntax verwendet.

%Vor%

Ergebnis:

%Vor%

BEARBEITEN: Sie können hier auch die Erweiterungsmethode vermeiden, da sie in alle IntelliSense-Dropdownlisten angezeigt wird. Siehe ein anderes Beispiel:

%Vor%

erzeugt auch korrekte Ergebnisse.

    
Roman Boiko 23.11.2009, 23:24
quelle
4

Dies ist nicht möglich, ohne den fraglichen Code zu analysieren.

Zur Laufzeit stehen nur zwei Teile von Typinformationen zur Verfügung, der tatsächliche Typ eines Wertes (über object.GetType ()) und, falls die betreffende Variable ein Parameter oder eine Klasse / Instanzvariable ist die Eigenschaft FieldType in einer FieldInfo, PropertyType auf einer PropertyInfo oder ParameterType für eine ParameterInfo.

Da der Wert, der an Sie weitergegeben wurde, über mehrere Variablen auf Ihrem Weg zu Ihnen gekommen sein kann, ist die Frage nicht einmal gut definiert, fürchte ich.

Ah - Ich sehe, dass Sie nur den Typ wollen, wie er derzeit in der Methode definiert ist, die Expression-Funktion liefert dies (Romans Antwort zeigt eine gute Methode dazu), aber Vorsicht, dies außerhalb der Methode zu verwenden ... Im Wesentlichen Sie lassen die generische Typinferenz des Compilers auf den fraglichen Typ schließen, aber das bedeutet, dass die verwendete Variable nicht immer die Variable ist, die Sie sehen können. Es kann stattdessen die einer synthetisierten Compilervariablen sein, zum Beispiel:

%Vor%

Da der Compiler eine temporäre Variable synthetisiert, in der eine Objektreferenz auf x gesetzt wird.

    
ShuggyCoUk 23.11.2009 23:23
quelle
2

Wiederholen Sie einfach GetType (), bis Sie auf Objekt drücken.

    
emptyset 23.11.2009 23:19
quelle

Tags und Links