Ich möchte eine Eigenschaft eines Objekts über Reflection mit einem Wert vom Typ festlegen string
. Nehmen wir zum Beispiel an, ich habe eine Ship
Klasse mit der Eigenschaft Latitude
a double
.
Folgendes möchte ich tun:
Ship ship = new Ship();
string value = "5.5";
PropertyInfo propertyInfo = ship.GetType().GetProperty("Latitude");
propertyInfo.SetValue(ship, value, null);
Wie es ist, wirft dies ein ArgumentException
:
Objekt vom Typ 'System.String' kann nicht in Typ 'System.Double' konvertiert werden.
Wie kann ich den Wert basierend auf dem richtigen Typ konvertieren propertyInfo
?
c#
reflection
type-conversion
propertyinfo
setvalue
David Hodgson
quelle
quelle
Antworten:
Sie können verwenden
Convert.ChangeType()
- Sie können Laufzeitinformationen für jedenIConvertible
Typ verwenden, um Darstellungsformate zu ändern. Es sind jedoch nicht alle Konvertierungen möglich, und Sie müssen möglicherweise eine Sonderfalllogik schreiben, wenn Sie Konvertierungen von Typen unterstützen möchten, die dies nicht sindIConvertible
.Der entsprechende Code (ohne Ausnahmebehandlung oder Sonderfalllogik) wäre:
quelle
TryChangeType
oderCanChangeType
?Wie mehrere andere gesagt haben, möchten Sie Folgendes verwenden
Convert.ChangeType
:Tatsächlich empfehle ich Ihnen, sich die gesamte
Convert
Klasse anzusehen .Diese Klasse und viele andere nützliche Klassen sind Teil des
System
Namespace . Ich finde es nützlich, diesen Namespace jedes Jahr oder so zu scannen, um zu sehen, welche Funktionen ich verpasst habe. Versuche es!quelle
Ich stelle fest, dass viele Leute empfehlen
Convert.ChangeType
- Dies funktioniert in einigen Fällen, aber sobald Sie anfangen,nullable
Typen einzubeziehen, erhalten SieInvalidCastExceptions
:Ein Wrapper wurde vor einigen Jahren geschrieben, um damit umzugehen, aber das ist auch nicht perfekt.
quelle
Ich habe die Antwort von LBushkin ausprobiert und es hat großartig funktioniert, aber es funktioniert nicht für Nullwerte und nullfähige Felder. Also habe ich es so geändert:
quelle
Sie können einen Typkonverter verwenden (keine Fehlerprüfung):
In Bezug auf die Organisation des Codes könnten Sie eine Art Mixin erstellen , das zu Code wie dem folgenden führt:
Dies würde mit diesem Code erreicht werden:
MPropertyAsStringSettable
kann für viele verschiedene Klassen wiederverwendet werden.Sie können auch eigene benutzerdefinierte Typkonverter erstellen , die an Ihre Eigenschaften oder Klassen angehängt werden:
quelle
object
?object
würde die Erweiterungsmethoden allen Klassen hinzufügen, was im Allgemeinen nicht wünschenswert ist.Sie suchen wahrscheinlich nach der
Convert.ChangeType
Methode. Zum Beispiel:quelle
Verwenden
Convert.ChangeType
und Abrufen des zu konvertierenden Typs aus demPropertyInfo.PropertyType
.quelle
Ich werde dies mit einer allgemeinen Antwort beantworten. Normalerweise funktionieren diese Antworten nicht mit Anleitungen. Hier ist auch eine funktionierende Version mit Anleitungen.
quelle
Oder Sie könnten versuchen:
quelle
Wenn Sie eine Metro-App schreiben, sollten Sie anderen Code verwenden:
Hinweis:
anstatt
quelle
Die Verwendung des folgenden Codes sollte Ihr Problem lösen:
quelle
Möchten Sie mit Reflection herumspielen oder eine Produktionssoftware erstellen? Ich würde fragen, warum Sie Reflektion verwenden, um eine Eigenschaft festzulegen.
quelle
GenericProgramming.exe:ReflectionBenefits()
)