【问题标题】:Assign direct value to object为对象分配直接值
【发布时间】:2015-03-09 19:20:31
【问题描述】:

我有几个属性,例如

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

SQLString 对象定义为:

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

请注意,通过这种方法,我的每个属性(例如FIRSTNAME)都可以有几个子属性,这是必要的。

要访问它们,例如FIRSTNAME.SQL_Column

这可行,但是我希望也能够在 FIRSTNAME 属性本身上存储一个值(例如字符串数据类型),这样访问它就像:

Dim MyFirstName As String = FIRSTNAME

而不是:

Dim MyFirstName As String = FIRSTNAME.Value

这是我目前必须做的。 我能看到的唯一方法是默认将 SQLString 对象设置为字符串(或其他数据类型),例如:

Public Class SQLString As String

显然上面的代码不起作用,但我想知道是否有等效的代码?

【问题讨论】:

标签: vb.net class properties


【解决方案1】:

你的问题的答案很简单;添加CType widening operator

例子:

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

测试:

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

Debug.WriteLine(myName)

输出(立即窗口)

比约恩

【讨论】:

  • 我尝试了类似的方法,但我仍然遇到的问题是,然后我无法访问(例如)FIRSTNAME.SQL_Column 的属性LimitSQL_Column无障碍
  • 嗯?看你的问题。 Dim MyFirstName As String 这里很明显你只需要一个字符串值。没有其他的。但是现在您突然需要所有其他属性?为什么不保持原样?
【解决方案2】:

当没有提供访问修饰符时,对属性(即:Public、Private 等)的默认访问修饰符是最严格的。在 SQLString 类中,由于类中的属性前面没有Public 访问修饰符,因此它们本质上是Private,并且无法从类外部访问。

将访问修饰符添加到属性应该可以解决您看到的问题:

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

请告诉我投票失败的问题 - 这是上面提议的代码更改的有效 .NET 小提琴 (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

这会产生输出:

Person Value: Test Value

【讨论】:

  • 不,这并不能解决我仍然需要FIRSTNAME.Value 而不仅仅是FIRSTNAME 来访问字符串的值的问题。
  • 请帮助我了解我缺少什么以及反对意见。我建议的更改允许您执行FIRSTNAME.Value。我提供了一个有效的 .NET fiddle 显示 - 请让我知道我的误解,以便我可以用我的答案解决任何具体问题。
  • 对不起,我的意思是我仍然需要FIRSTNAME 来访问值而不是FIRSTNAME.Value,因为此代码将在我的项目中使用数百次,我想避免.Value .抱歉,我的评论有误。
  • 这对你的意图是有道理的,但我不相信这是直接可能的。您描述的是“默认”关键字,但本质上,默认需要一个索引(即:FIRSTNAME(i)),以便 VB 可以区分分配默认属性和类本身(即:FIRSTNAME = new SQLString(...))。没有直接的方法可以为您的代码执行类似的操作。最好的选择可能是投资 Resharper 或类似的东西来为您重构所有代码。
猜你喜欢
  • 2020-10-30
  • 2011-05-30
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多