Ich möchte eine Zeichenfolge in einen Objekteigenschaftswert konvertieren, dessen Namen ich als Zeichenfolge habe. Ich versuche das so zu machen:
string modelProperty = "Some Property Name";
string value = "SomeValue";
var property = entity.GetType().GetProperty(modelProperty);
if (property != null) {
property.SetValue(entity,
Convert.ChangeType(value, property.PropertyType), null);
}
Das Problem ist, dass dies fehlschlägt und eine ungültige Cast-Ausnahme auslöst, wenn der Eigenschaftstyp ein nullbarer Typ ist. Dies ist nicht der Fall, wenn die Werte nicht konvertiert werden können - sie funktionieren, wenn ich dies manuell mache (z. B. DateTime? d = Convert.ToDateTime(value);
) Ich habe einige ähnliche Fragen gesehen, kann sie aber immer noch nicht zum Laufen bringen.
c#
.net
reflection
iboeno
quelle
quelle
Antworten:
Ungetestet, aber vielleicht funktioniert so etwas:
quelle
(value == null) ? null
benutzen(value == null) ? default(t)
?safeValue
Variable zu erstellen , anstatt sie nur neu zuzuweisenvalue
?Sie müssen den zugrunde liegenden Typ erhalten, um das zu tun ...
Versuchen Sie dies, ich habe es erfolgreich mit Generika verwendet:
Ich verwende es an mehreren Stellen in meinem Code. Ein Beispiel ist eine Hilfsmethode, mit der ich Datenbankwerte typsicher konvertiere:
Aufgerufen mit:
Ich schrieb eine Reihe von Blog - Posts einschließlich diesem bei http://www.endswithsaurus.com/2010_07_01_archive.html (Scrollen Sie zum Addendum, @JohnMacintyre tatsächlich den Fehler in meinem ursprünglichen Code entdeckt , der mich auf dem gleichen Weg führten Sie sind bin jetzt online). Ich habe seit diesem Beitrag ein paar kleine Änderungen vorgenommen, die auch die Konvertierung von Aufzählungstypen beinhalten. Wenn Ihre Eigenschaft also eine Aufzählung ist, können Sie immer noch denselben Methodenaufruf verwenden. Fügen Sie einfach eine Zeile hinzu, um nach Aufzählungstypen zu suchen, und Sie können mit folgenden Methoden zu den Rennen gehen:
Normalerweise haben Sie eine Fehlerprüfung oder verwenden TryParse anstelle von Parse, aber Sie erhalten das Bild.
quelle
Dies ist zum Beispiel etwas langwierig, aber dies ist ein relativ robuster Ansatz, der die Aufgabe des Castings vom unbekannten Wert zum unbekannten Typ trennt
Ich habe eine TryCast-Methode, die etwas Ähnliches tut und nullbare Typen berücksichtigt.
Natürlich ist TryCast eine Methode mit einem Typparameter. Um sie dynamisch aufzurufen, müssen Sie die MethodInfo selbst erstellen:
So legen Sie den tatsächlichen Eigenschaftswert fest:
Und die Erweiterungsmethoden für den Umgang mit property.CanAssignValue ...
quelle
Ich hatte ein ähnliches Bedürfnis und die Antwort von LukeH wies mich in die Richtung. Ich habe mir diese generische Funktion ausgedacht, um es einfach zu machen.
Die Verwendung ist wie folgt:
Beachten Sie, dass der zweite Parameter nur als Prototyp verwendet wird, um der Funktion zu zeigen, wie der Rückgabewert umgewandelt wird, sodass er nicht unbedingt die Zieleigenschaft sein muss. Das heißt, Sie können auch so etwas tun:
Ich habe es auf diese Weise gemacht, anstatt ein Out zu verwenden, weil Sie Out nicht mit Eigenschaften verwenden können. So wie es ist, kann es mit Eigenschaften und Variablen arbeiten. Sie können auch eine Überladung erstellen, um den Typ zu übergeben, wenn Sie möchten.
quelle
Danke @LukeH
Ich habe mich ein wenig verändert:
quelle
Ich habe es so gemacht
quelle