Problem mit TypeConverter

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von hal2000.

    Problem mit TypeConverter

    Hallo,

    ich habe ein Problem mit dem TypeConverter meiner Klasse in VB.NET. Ich bin dabei einen Datentyp namens FString zu entwickeln.

    VB.NET-Quellcode

    1. <System.ComponentModel.TypeConverterAttribute(GetType(FStringConverter))> _
    2. Public Class FString
    3. Implements IDisposable
    4. Private p As IntPtr
    5. ' [...] usw.
    6. End Class

    Damit eine direkte Umwandlung von und in den Datentyp String möglich ist, wollte ich also einen TypeConverter für die Klasse bereitstellen:

    VB.NET-Quellcode

    1. Public Class FStringConverter
    2. Inherits System.ComponentModel.TypeConverter
    3. Public Overloads Overrides Function CanConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal sourceType As System.Type) As Boolean
    4. If sourceType Is GetType(String) Then
    5. Return True
    6. Else
    7. Return MyBase.CanConvertFrom(context, sourceType)
    8. End If
    9. End Function
    10. Public Overloads Overrides Function CanConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal destinationType As System.Type) As Boolean
    11. If destinationType Is GetType(String) Then
    12. Return True
    13. Else
    14. Return MyBase.CanConvertTo(context, destinationType)
    15. End If
    16. End Function
    17. Public Overloads Overrides Function ConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object) As Object
    18. If TypeOf value Is String Then
    19. Try
    20. Dim a As New FString
    21. a.Write(value)
    22. Return a
    23. Catch
    24. Throw New InvalidCastException(value)
    25. End Try
    26. Else
    27. Return MyBase.ConvertFrom(context, culture, value)
    28. End If
    29. End Function
    30. Public Overloads Overrides Function ConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object, ByVal destinationType As System.Type) As Object
    31. If destinationType is GetType(String) Then
    32. Return DirectCast(value, FString).Read
    33. Else
    34. Return MyBase.ConvertTo(context, culture, value, destinationType)
    35. End If
    36. End Function
    37. End Class


    Die Umwandlung ist folgendermaßen natürlich problemlos möglich:

    VB.NET-Quellcode

    1. Dim f As FString = System.ComponentModel.TypeDescriptor.GetConverter(GetType(FString)).ConvertFrom("somestring")


    Aber ich würde auch gerne die direkte Schreibweise nutzbar machen - also

    VB.NET-Quellcode

    1. Dim f As FString = "somestring"


    Weiß jemand eine Lösung? Wahrscheinlich stelle ich mich einfach nur blöd an.

    LG

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „kevin89“ ()

    Hi,

    du musst den Operator CType überladen, sodass implizite Konvertierungen von String in FString (und umgekehrt) möglich werden. Beispiel:

    VB.NET-Quellcode

    1. Public Class FString
    2. Dim _intern As String
    3. Public Shared Widening Operator CType(ByVal a As String) As FString
    4. Return New FString(a)
    5. End Operator
    6. Public Shared Widening Operator CType(ByVal a As FString) As String
    7. Return a._intern
    8. End Operator
    9. Public Sub New(ByVal contains As String)
    10. _intern = contains
    11. End Sub
    12. End Class
    13. Module Ftest
    14. Dim f As FString = "hallo"
    15. Dim g As String = f
    16. End Module

    "Widening" legt fest, dass diese Konvertierung implizit (direkte Zuweisung mit = ) erfolgen darf. Im Gegensatz dazu würde "Narrowing" nur die explizite Konvertierung erlauben (mit CType).

    EDIT: Wenn bei der impliziten Konvertierung Daten verloren gehen können (z.B. weil FString weitere Member enthält, die von CType nicht berücksichtigt werden), solltest du den Operator mit "Narrowing" überladen.
    Gruß
    hal2000

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „hal2000“ ()