Typecasting generic parameters
Verwenden Sie den folgenden Code:
Function GetSetting(Of T)(ByVal SettingName As String, ByRef DefaultVal As T) As T
Return If(Configuration.ContainsKey(SettingName), CType(Configuration(SettingName), T), DefaultVal)
End Function
Ergibt den folgenden Fehler:
Value of type 'String' cannot be converted to 'T'.
Wie auch immer ich angeben könnte, dass die Konvertierung in allen Fällen tatsächlich möglich sein wird (ich erhalte im Grunde genommen Ganzzahlen, Boolesche Werte, Doubles und Strings).
Bearbeite: Es scheint jetzt drei Lösungen zu geben:
Verwenden Sie die Funktion `ValueAs` von AMissicoCasting zu einem `Objekt`, dann zu` T`, mit einer Prüfung auf NullwerteVerwenden eines `DirectCast` über Convert.ChangeTypeWelche würdest du vorschlagen?
Edit 2: Würde dieser Code funktionieren?
Function GetSetting(Of T)(ByVal SettingName As String, Optional ByRef DefaultVal As T = Nothing) As T
Return If(Configuration.ContainsKey(SettingName), ConvertTo(Of T)(Configuration(SettingName)), DefaultVal)
End Function
Function ConvertTo(Of T)(ByVal Str As String) As T
Return If(Str Is Nothing Or Str = "", Nothing, CType(CObj(Str), T))
End Function
Edit 3: [AMJ] Arbeitscode
Function GetSetting(Of T)(ByVal SettingName As String) As T
Return GetSetting(Of T)(SettingName, Nothing)
End Function
Function GetSetting(Of T)(ByVal SettingName As String, ByVal DefaultVal As T) As T
Dim sValue As String = Configuration(SettingName)
If Len(sValue) = 0 Then
Return DefaultVal
Else
Return CType(CObj(sValue), T)
End If
End Function
Schnelltestmethode
Public Sub DoIt()
Me.Configuration.Add("KeyN", Nothing)
Me.Configuration.Add("KeyE", String.Empty) '""
Me.Configuration.Add("Key1", "99")
Me.Configuration.Add("Key2", "1/1/2000")
Me.Configuration.Add("Key3", "True")
Me.Configuration.Add("Key4", "0")
Dim o As Object 'using object in order to see what type is returned by methods
o = Value(Of Integer)("KeyN", 10) '10
o = Value(Of Integer)("KeyE", 10) '10
o = Value(Of Integer)("Key1", 10) '99
o = Value(Of Date)("KeyN", #11/11/2010#)
o = Value(Of Date)("KeyE", #11/11/2010#)
o = Value(Of Date)("Key2", #11/11/2010#)
o = GetSetting(Of Integer)("KeyN", 10) '10
o = GetSetting(Of Integer)("KeyE", 10) '10
o = GetSetting(Of Integer)("Key1", 10) '99
o = GetSetting(Of Date)("KeyN", #11/11/2010#)
o = GetSetting(Of Date)("KeyE", #11/11/2010#)
o = GetSetting(Of Date)("Key2", #11/11/2010#)
Stop
End Sub