50 Stimmen

Die generische Konvertierungsfunktion scheint nicht mit Guids zu funktionieren

Ich habe den folgenden Code:

public static T ParameterFetchValue<T>(string parameterKey)
{
    Parameter result = null;

    result = ParameterRepository.FetchParameter(parameterKey);

    return (T)Convert.ChangeType(result.CurrentValue, typeof(T), CultureInfo.InvariantCulture);  
}

Die Art der result.CurrentValue ist eine Zeichenkette . Ich würde es gerne in eine Guid umwandeln, aber ich erhalte immer wieder die Fehlermeldung:

Ungültiger Cast von System.String nach System.Guid

Dies funktioniert perfekt mit primitiven Datentypen.
Gibt es eine Möglichkeit, die dies auch für nicht-primitive Datentypen zu ermöglichen ?

137voto

Marc Gravell Punkte 970173

Wie wäre es damit:

T t = (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(text);

Funktioniert gut für Guid und die meisten anderen Typen.

9 Stimmen

Seien Sie vorsichtig bei der Verwendung von ConvertFromInvariantString. Wenn Ihr Typ ein DateTime ist und Sie internationale Datumsformate haben, wird dies explodieren. Ich habe gerade einen wirklich schwer zu findenden Fehler auf der Grundlage dieser Antwort aufgespürt.

1 Stimmen

@DPeden in der Tat, sie müssen übereinstimmen - meine Verwendung hier war die Verwendung von invariant in der Annahme, dass serialisierte Daten normalerweise in einem invarianten Format vorliegen sollten

2 Stimmen

Ja, das stimmt. Ich habe Ihre Antwort trotzdem hochgestuft, da sie sehr nützlich ist. Nur darauf hinweisen, dieses Potenzial gotcha für andere, wie es mir verbrannt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X