【问题标题】:Reference Label1.Text as Object引用 Label1.Text 作为对象
【发布时间】:2010-11-09 09:06:14
【问题描述】:

如果我通过一个函数传递 Label1.Text,它会将其视为对象而不是字符串。哪个好。

但是当我做类似的事情时:

Dim temp As Object = Label1.Text

然后将其传递给一个将其视为字符串的函数,这是意料之中的。我怎样才能做到这一点,以便我可以将 Label1.Text 设置为一个对象,就像我只是通过一个函数传递它一样。

编辑:这就是我想做的事情

Public Sub test()
    setIt(Label1.Text, "Test") 'this works

    Dim temp As Object = Label1.Text
    setIt(temp, "Test") 'this doesnt work
End Sub
Public Sub setIt(ByRef e, ByVal v)
    e = v
End Sub

【问题讨论】:

  • 从这看起来你是想在标签中创建一个到文本属性的链接,这样你就可以使用这个方法设置它setIt
  • 是的,但我需要它对任何属性开放,而不仅仅是文本。
  • 检查我的编辑,看看我从一些反射代码改编的新功能。
  • 无论如何,这是一种不好的做法,请务必注意这一点。

标签: vb.net


【解决方案1】:

一个字符串就是一个字符串,不管你是否将它向下转换为一个对象。您可以通过typeof temp is String (typeof-keyword) 进行检查。

我不明白你的实际问题在哪里。

您不能使用给定对象设置标签的文本属性,因为Label.Text 必须是字符串类型。但是您可以使用 Object 的 ToString 来获取您的 Object 的 String 表示,或者如果您知道(检查 typeof)您的 Object 是 String 类型,您可以简单地将其转换回:

Label1.Text = DirectCast(temp , String)

编辑: 根据您的更新,我强烈recommend 设置Option Strict! 为什么不简单地将值分配给 Text 属性?

Label1.Text = "Test"

You're ByRef 方法非常容易出错且可读性差。 如果你真的需要这样的东西并且你只想设置不同控件的 Text 属性,试试这个:

Public Sub setControlText(ByVal ctrl As Control, ByVal text String)
   ctrl.Text = text
End Sub

或者如果你的“文本”必须是对象类型:

Public Sub setControlText(ByVal ctrl As Control, ByVal value As Object)
       If Not value Is Nothing Then ctrl.Text = value.ToString
End Sub

或者你可以使用反射来设置每个属性,但这不应该是标准的

Public Sub setProperty(ByVal obj As Object, ByVal propName As String, ByVal newValue As Object)
    Dim prop As Reflection.PropertyInfo = obj.GetType().GetProperty(propName)
    If Not prop Is Nothing AndAlso prop.CanWrite Then
        prop.SetValue(obj, newValue, Nothing)
    End If
End Sub

您可以通过以下方式调用此函数(考虑到属性名称区分大小写):

setProperty(Label1, "Text", "Hello World!")

【讨论】:

  • 如果您只设置文本,我会推荐 Tim 的方法,并且仅当您必须能够灵活地设置对象或控件中的任何属性时才使用我的方法。
  • 最后一节基本上就是我刚刚写的:|
  • 是的,我后来看到了。但我认为我们把他引向了错误的方向。我确信反射方法在他的情况下是开销。
  • 同意,我会接受最初的建议,即仅使用 text 属性保持严格和明确,或者将控件称为对象本身。
  • 感谢反射是我正在寻找的。我实际上已经研究过反射,但一直被困在 setvalue 上,并认为我做错了什么。但是您的代码有效并解决了我的问题!
【解决方案2】:

虽然你可以使用这个来转换和总结:

Dim objTemp As Object = CObj(Label1.Text)

Dim objTemp As Object = CType(Label1.Text, Object)

然后当您以后需要它时,只需使用相反的方式打开它

Dim strTemp As String = CType(objTemp, String)

编辑:

如果您使用这个小函数并使用属性的字符串声明调用它,那么您可以动态编辑您的对象属性。

 Public Shared Sub SetPropertyValue(ByVal o As Object, _
                     ByVal propertyName As String, ByVal newValue As Object)
        Dim pi As Reflection.PropertyInfo
        pi = o.[GetType]().GetProperty(propertyName)
        If pi Is Nothing Then
            Throw New Exception("No Property [" & propertyName & "] in Object [" & o.[GetType]().ToString() & "]")
        End If
        If Not pi.CanWrite Then
            Throw New Exception("Property [" & propertyName & "] in Object [" & o.[GetType]().ToString() & "] does not allow writes")
        End If
        pi.SetValue(o, newValue, Nothing)
    End Sub

呼叫:

SetPropertyValue(objTemp, "Phone", newVal)

或者在你的情况下使用Label1

Dim newVal as String = "Test"
SetPropertyValue(Label1, "Text", newVal)

希望对您有所帮助。

【讨论】:

  • 你已经交换了 CType 中的顺序
  • 谢谢蒂姆!我会把它归咎于我早上没有喝咖啡。
猜你喜欢
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 2019-03-25
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多