Jason
Jason

Reputation: 146

Assign direct value to object

I have several properties, for example

Public Property FIRSTNAME As New SQLString("FirstName", 50)
Public Property FULLNAME As New SQLString("Name", 50)

The SQLString object is defined as:

Public Class SQLString
    Property SQL_Column As String
    Property Limit As Integer
    Property Value As String

    Public Sub New(SQLcolumn As String, limit_ As Integer)
        SQL_Column = SQLcolumn
        Limit = limit_
    End Sub

    Public ReadOnly Property SQL_value() As String
        Get
            Return "'" & clean(Value, Limit) & "'"
        End Get
    End Property
End Class

Notice that through this method, each of my properties (e.g. FIRSTNAME) is able to have several sub properties, which is necessary.

To access them, it's simply for example FIRSTNAME.SQL_Column.

This works, however what I would like is to also be able to store a value (e.g. string data type) on the FIRSTNAME property itself, which would make accessing it like:

Dim MyFirstName As String = FIRSTNAME

Rather than:

Dim MyFirstName As String = FIRSTNAME.Value

Which is what I currently have to do. The only way I can see to do this is to have the SQLString object be set to string (or another data type) by default, like:

Public Class SQLString As String

Obviously the above code does not work, but I'm wondering if there is an equivalent that does?

Upvotes: 3

Views: 1690

Answers (2)

The answer to your question is quite simple; add a CType widening operator.

Example:

Public Class SQLString

    Public Shared Widening Operator CType(ByVal s As SQLString) As String
        Return If((s Is Nothing), Nothing, s.Value)
    End Operator

    Public Property Value As String

End Class

Test:

Dim firstName As New SQLString() With {.Value = "Bjørn"}
Dim myName As String = firstName

Debug.WriteLine(myName)

Output (immediate window):

Bjørn

Upvotes: 2

Jason W
Jason W

Reputation: 13209

The default access modifier to a property (ie: Public, Private, etc) is the most restrictive when no access modifier is provided. In SQLString class, since there is not a Public access modifier in front of the properties in the class, they are essentially Private and not accessible from outside of the class.

Adding the access modifier to the properties should fix the issue you see:

Public Property SQL_Column As String
Public Property Limit As Integer
Public Property Value As String

Please tell me the problem for the vote downs - here is a working .NET fiddle of the proposed code changes above (https://dotnetfiddle.net/96o8qm).

Imports System
Dim p as Person = new Person()
p.FIRSTNAME = new SQLString("Test", 1)
p.FIRSTNAME.Value = "Test Value"
Console.WriteLine("Person Value: {0}", p.FIRSTNAME.Value)

Public Class Person
    Public Property FIRSTNAME AS SQLString
End Class

Public Class SQLString
    Public Property SQL_Column As String
    Public Property Limit As Integer
    Public Property Value As String

    Public Sub New(SQLcolumn As String, limit_ As Integer)
        SQL_Column = SQLcolumn
        Limit = limit_
    End Sub

    Public ReadOnly Property SQL_value() As String
        Get
            Return ""
        End Get
    End Property

End Class

This yields the output:

Person Value: Test Value

Upvotes: 2

Related Questions