2009-05-21 8 views
0

Ich bin einen Typ-Wandler zur Verwendung in einer in-house-Bibliothek erstellen, sollte in der Lage von jeden Typen durch eine Datenbank (lang, DBNull, bool, string, etc ...) zu einem kompatibel zurück konvertieren Art.Was ist der richtige Weg, um eine Zeichenfolge in einen unbekannten numerischen Typ zu konvertieren?

Das alles funktioniert Finne und gut für Gegenstände, die gegossen kann entweder:

try { return (T)value } catch(InvalidCaseException) { } 

oder analysiert werden kann:

siehe Convert to a Nullable<T> from a string using Reflection

jedoch Ich schlage eine Mauer, wenn Ich möchte dieses gewünschte Verhalten:

Assert.That(
    2, 
Is.EqualTo(
    Converter<long>.Convert("2.1") 
)); 

Das Problem ist, dass th Die Pasre- und TryParse-Funktionen führen dies als ungültiges Format zurück, wenn das tatsächliche gewünschte Ergebnis darin besteht, die Dezimalzahl abzuschneiden.

Was Sie würden denken der beste Weg, eine Zeichenfolge wie „2.1“ auf einen unbekannten Wert Typ mit Reflexion zu analysieren?

EDIT: Zur Zeit bin ich mit:

if (Nullable.GetUnderlyingType(t) != null) 
{ 
    t = Nullable.GetUnderlyingType(t); 
} 

MethodInfo parse = t.GetMethod("Parse", new Type[] { typeof(string) }); 

if (parse != null) 
{ 
    object parsed = parse.Invoke(null, new object[] { value.ToString() }); 
    return (T)parsed; 
} 
else 
{ 
    throw new InvalidOperationException("The value you specified is not a valid " + typeof(T).ToString()); 
} 

Antwort

4

Welche Version von .NET und welche Wertebereich? Eine Möglichkeit, zum Beispiel, wäre es als Dezimalzahl zu analysieren und konvertiert es von dort ...

T val = Convert.ChangeType(decimal.Parse("2.1"), typeof(T)) 

(die oben nur die zentralen Konvertierung zeigt - es ist nicht in Ihren vorhandenen Code paßt versuchen)

Dies wird nicht für große/sehr kleine Werte funktionieren, aber wahrscheinlich nicht die gleichen Rundungsprobleme wie double leiden.

+0

Ich denke, das wird für mich arbeiten. Grundsätzlich, wenn ich ein Double möchte, wird das "Parse" es aufnehmen. Wenn ich jedoch eine Nummer wie "1000000000000.1" habe, möchte ich das als lang verwendbar sein. Ich sehe, dass eine Dezimalzahl 128 Bit ist, aber hat sie eine größere Genauigkeit als eine lange? –

+0

In Bezug auf den Hauptwert ist es nur 96 Bit - also ja, länger als lang (64 Bit); aber es ist langsamer als Folge - keine CPU-Unterstützung. –

Verwandte Themen