【问题标题】:About Casting in a Class property in VB.Net关于在 VB.Net 中的 Class 属性中进行强制转换
【发布时间】:2019-04-09 13:07:21
【问题描述】:

是否可以在类属性中强制转换? 我想做的是从“我的”类中获取表单的文本属性。但是对于每个表单,我都必须静态地提供表单名称。我想动态地做到这一点。我试过的就在这里

    Dim frmName As New Object
    frmName = Name.ToString()

    Dim frmProperty As String

    frmProperty = "My.Forms." & frmName & ".Text"

    frmNameLabelControl.Text = frmProperty  

但在前端显示“My.Forms.Form1.Text”

【问题讨论】:

  • 我认为你不明白演员表是什么。它们不是魔法。该词与“以不同的方式投射某些东西”在相同的上下文中使用。演员表不会将某些东西变成其他东西。它只是让您以不同的方式访问它。要将某物转换为特定类型,该物实际上必须是该类型。例如。如果将Form 对象分配给Object 变量,则可以将其转换为Form 类型,因为它是Form。但是,如果您分配 String 并尝试转换为 Form 类型,则会失败,因为 String 不是 Form
  • 你的建议没有任何意义。 My.Forms 是一种访问项目中每种表单类型的默认实例的方法。这意味着它提供对每种类型的一个实例的访问,并且始终只提供一个实例。您可能已显示或未显示每种类型的一个实例,并且您可能已显示其他实例。如果您真正想要的是访问当前打开的每个表单,那么您需要使用My.Application.OpenForms。这是一个集合,因此您可以循环并获取类型和 Text 属性以及您喜欢的任何其他内容。
  • 你到底为什么要以这种方式使用String?当人们想像这样使用Strings 来识别事物时,通常表明存在设计缺陷。
  • 您的代码将无法使用应始终使用的 Option Strict 进行编译。
  • 计算机有这种烦人的习惯,就是按照你告诉他们的去做。当您将某些内容放在引号“”中时,它是一个字符串。因此,您构建了一个包含三个部分的字符串,并显示在标签中。 Form1 的 Name 属性是 Form1。窗体的 Text 属性是显示在窗口顶部的内容。除非您更改它,否则它也将是 Form1。

标签: vb.net class dynamic casting


【解决方案1】:

我认为您只需要以下代码。但是您需要在每个表单中以相同的顺序创建等效的 frmNameLabelControl。例如成为您在每个表单中创建的最后一个标签

    Dim FormsCount As Integer = My.Application.OpenForms.Count
    Dim frmProperty As String
    Dim lblContrIndex As Integer = 0 ' Number of label creation in descending order

    For i As Integer = 0 To FormsCount - 1

        frmProperty = My.Application.OpenForms.Item(i).Text
        My.Application.OpenForms.Item(i).Controls.OfType(Of Label).ElementAt(lblContrIndex).Text = frmProperty

    Next

【讨论】:

  • 我想动态获取表单的 Text 属性。我不知道如何得到这个。我所做的是完全错误的,我知道这一点。现在我知道该怎么做了。有一个简单的代码可以获取 Text 属性,即' Me.Text ' 谢谢大家。 @andreas
猜你喜欢
  • 2014-09-12
  • 2016-11-10
  • 1970-01-01
  • 2013-04-06
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
相关资源
最近更新 更多