Mein besonderes Problem:
Ich habe eine Zeichenfolge, die einen Typ in einer Konfigurationsklasse angibt
Config.numberType = "System.Foo";
wobei Foo
ein Typ wie Decimal
oder Double
Ich verwende Type.GetType(Config.numberType)
, um den entsprechenden Typ zurückzugeben.
Wie komme ich von diesem Typ zur Verwendung, System.Foo.TryParse()
?
Einige weitere verwandte Fragen
TryParse()
kann von System.Foo.TryParse()
sowie von foo.TryParse()
zugegriffen werden. Bedeutet das, dass foo
irgendeine Art von Klasse in C # ist? Das erscheint mir seltsam, dass int
, double
usw. eigentlich nicht nur Modifikationsschlüsselwörter sind. var
ist nicht universell verwendbar, d. h. nur im lokalen Bereich etc. Wie viele schon gesagt haben - es gibt keinen direkten Weg. Ich erwarte eine enge Option ist TypeConverter
:
Natürlich benötigen Sie möglicherweise try
/ catch
, um Ausnahmen zu behandeln. So ist das Leben.
Wie komme ich von diesem Typ zum Sein? fähig, System.Foo.TryParse () zu verwenden?
Sie müssen die Reflektion verwenden, um nach der statischen TryParse()
Methode zu suchen und diese aufzurufen. Nicht alle Typen implementieren diese Methode - Sie müssen also entscheiden, wie Sie mit dieser Methode umgehen sollen, wenn sie fehlt. Sie können auch System.Convert
verwenden, um eine Zeichenfolge in einen beliebigen Typ zu konvertieren, unter der Annahme, dass string ist eigentlich eine gültige Repräsentation eines Wertes für diesen Typ und es ist eine Konvertierung implementiert.
AufTryParse () kann von zugegriffen werden System.Foo.TryParse () sowie foo.TryParse (). Heißt das, foo ist? eine Art von Klasse in C #?
int
, double
usw. sind Aliase für System.Int32
, System.Double
usw. - sie sind Teil der C # -Sprache, die ohne sie unangenehm ausführlich wäre.
Wie können Sie Variablen unter deklarieren? diese Umstände?
Wenn Sie den Typ zum Zeitpunkt der Kompilierung nicht kennen, müssen Sie Ihre Daten als object
/ System.Object
deklarieren und damit arbeiten. C # 4.0 wird aktuelle dynamische Typen vorstellen, die einige der langwierigen Reflektionsarbeiten für Sie erledigen werden, aber für den Moment stecken Sie fest, es von Hand zu tun. Beachten Sie, dass wenn Sie System.Convert
verwenden in einer Methode mit einem Argument vom Typ parametrized und return oder TryParse()
mit einer Technik wie dem von Sebastian Sedlak verlinkt, können Sie leicht die Fähigkeit erreichen, Client-Code zu schreiben, der mit statischen Typen arbeitet ... solange sie mit den Typen übereinstimmen, die Sie analysieren .
EDITED: Ich habe die generische Implementierung entfernt und diese Antwort bereinigt, um besser zu dem ursprünglich angegebenen Problem zu passen.
HINWEIS: Die Antwort von Marc Gravell ist wahrscheinlich die prägnanteste, wenn Sie nur den geparsten Wert für den Typ angeben möchten. Die folgende Antwort zeigt Ihnen, wie Sie an die Methode gelangen (d. H. Das MethodInfo-Objekt und wie es aufgerufen wird).
Das folgende sollte zumindest für Typen funktionieren, die das öffentliche Static bool TryParse (string, T-Wert) implementieren:
%Vor%Verwenden Sie den folgenden Testcode:
%Vor%Und verwenden Sie dies in Ihrem Fall:
%Vor%Über die Verwendung von var: Sie haben möglicherweise ein falsches Verständnis davon, was var bewirkt: Es ist kein "variant" -Typ (das type-Objekt wird bereits dafür verwendet), sondern verschiebt die Deklarationssyntax für den Typ auf die rechte Seite der Zuweisung . Die folgenden Deklarationen sind äquivalent:
%Vor%Die primäre Verwendung von var besteht darin, anonyme Typen zu erstellen:
%Vor%Und noch ein guter Link zu diesem Problem . Der Quellcode auf dieser Seite ist sehr schlecht formatiert, also habe ich ihn hier eingefügt. Hoffentlich verurteilt mich der Autor nicht.
%Vor%