Wie komme ich von einem Typ zur TryParse-Methode?

7

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

ist

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

  • Auf 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.
  • Wie können Sie unter diesen Umständen Variablen deklarieren? - var ist nicht universell verwendbar, d. h. nur im lokalen Bereich etc.
Brendan 24.01.2009, 20:11
quelle

5 Antworten

20

Wie viele schon gesagt haben - es gibt keinen direkten Weg. Ich erwarte eine enge Option ist TypeConverter :

%Vor%

Natürlich benötigen Sie möglicherweise try / catch , um Ausnahmen zu behandeln. So ist das Leben.

    
Marc Gravell 24.01.2009, 21:07
quelle
7
  

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.

  Auf

TryParse () 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 .

    
Shog9 24.01.2009 20:20
quelle
5

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%     
ILoveFortran 05.02.2009 02:21
quelle
1

das kann helfen: Ссылка

    
Sebastian 24.01.2009 20:23
quelle
1

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%     
Oliver 03.02.2010 11:30
quelle

Tags und Links