Ich habe eine Klasse, mit der ich "Eigenschaften" für eine andere Klasse speichern möchte. Diese Eigenschaften haben einfach einen Namen und einen Wert. Im Idealfall möchte ich typisierte Eigenschaften hinzufügen können , damit der zurückgegebene "Wert" immer von dem Typ ist, den ich möchte.
Der Typ sollte immer ein Grundelement sein. Diese Klasse unterklassifiziert eine abstrakte Klasse, in der Name und Wert grundsätzlich als Zeichenfolge gespeichert sind. Die Idee ist, dass diese Unterklasse der Basisklasse eine gewisse Typensicherheit hinzufügt (und mich bei einigen Konvertierungen erspart).
Also habe ich eine Klasse erstellt, die (ungefähr) so lautet:
public class TypedProperty<DataType> : Property
{
public DataType TypedValue
{
get { // Having problems here! }
set { base.Value = value.ToString();}
}
}
Die Frage ist also:
Gibt es eine "generische" Möglichkeit, von einem String zurück in ein Grundelement zu konvertieren?
Ich kann anscheinend keine generische Schnittstelle finden, die die Konvertierung auf der ganzen Linie verknüpft (so etwas wie ITryParsable wäre ideal gewesen!).
quelle
Antworten:
Ich bin nicht sicher, ob ich Ihre Absichten richtig verstanden habe, aber mal sehen, ob dies hilft.
quelle
Convert.ChangeType
es keine sehr universelle und erweiterbare Lösung ist, funktioniert es für die meisten Basistypen. Wenn etwas Besseres benötigt wird, ist es kein Problem, diese Methode in etwas Größeres zu verpacken, wie es Tim vorgeschlagen hat, oder eine andere Konvertierungsmethode zu verwenden.Die Methode von lubos hasko schlägt für nullables fehl. Die folgende Methode funktioniert für Nullables. Ich habe es mir aber nicht ausgedacht. Ich habe es über Google gefunden: http://web.archive.org/web/20101214042641/http://dogaoztuzun.com/post/C-Generic-Type-Conversion.aspx Gutschrift für "Tuna Toksoz"
Verwendung zuerst:
Die Klasse ist unten.
quelle
tc
(dieTypeConverter
) wahrscheinlich nur einmal erstellen .TypeConverter
ist langsam, weil es Reflexion verwendet, um nach dem zu suchenTypeConverterAttribute
. Wenn Sie ein einzelnes privatesTypeConverter
Feld initialisieren , sollten Sie esTypeConverter
viele Male wiederverwenden können .object
, wird eine Ausnahme ausgelöst. Ich konnte dies umgehen, indem ich `if (typeof (T) .IsPrimitive) {return TConverter.ChangeType <T> (StringValue); } else {object o = (object) StringValue; zurückkommen zu; } `als Ersatz für das VerwendungsbeispielTConverter.ChangeType<T>(StringValue)
Für viele Typen (Integer, Double, DateTime usw.) gibt es eine statische Parse-Methode. Sie können es mit Reflection aufrufen:
quelle
TypeDescriptor
ist eine Klasse mit einer Methode,GetConvertor
die einType
Objekt akzeptiert. Anschließend können Sie eineConvertFrom
Methode aufrufen , um dievalue
für das angegebene Objekt zu konvertieren .quelle
Sie könnten möglicherweise ein Konstrukt wie eine Merkmalsklasse verwenden . Auf diese Weise hätten Sie eine parametrisierte Hilfsklasse, die weiß, wie eine Zeichenfolge in einen Wert ihres eigenen Typs konvertiert wird. Dann könnte Ihr Getter so aussehen:
Nun muss ich darauf hinweisen, dass meine Erfahrung mit parametrisierten Typen auf C ++ und seine Vorlagen beschränkt ist, aber ich stelle mir vor, dass es eine Möglichkeit gibt, mit C # -Generika dasselbe zu tun.
quelle
Überprüfen Sie die statische Aufladung
Nullable.GetUnderlyingType
. - Wenn der zugrunde liegende Typ null ist, ist der Vorlagenparameter nicht null,Nullable
und wir können diesen Typ direkt verwenden. - Wenn der zugrunde liegende Typ nicht null ist, verwenden Sie den zugrunde liegenden Typ bei der Konvertierung.Scheint für mich zu arbeiten:
quelle
Inspiriert von der Antwort von Bob unterstützen diese Erweiterungen auch die Nullwertkonvertierung und alle primitiven Konvertierungen zurück und viertens.
Beispiele
quelle
Ich benutze die Konvertierung über ein Objekt. Es ist ein bisschen einfacher.
quelle
Ich habe Lobos Antwort verwendet und es funktioniert. Aber ich hatte ein Problem mit der Umwandlung von verdoppelt wegen der Kultureinstellungen. Also habe ich hinzugefügt
quelle
Noch eine Variation. Behandelt Nullables sowie Situationen, in denen die Zeichenfolge null und T nicht nullable ist.
quelle
Sie können dies in einer Zeile wie folgt tun:
Viel Spaß beim Codieren;)
quelle