【问题标题】:How to access properties of a class using Object type variable?如何使用 Object 类型变量访问类的属性?
【发布时间】:2020-06-28 18:14:17
【问题描述】:

我已经声明了一个 OBJECT 类型的“变量”。我还声明了一个名为 TEST 的类,它有一个属性“name”。我的理解是,在语句 variable = New test() 中,编译器正在创建类 TEST 的新实例,并将该新创建实例的引用/内存地址存储在“变量”中。这个想法是对象类型的变量应该能够存储任何类型的数据或其引用。通过使用成员访问器运算符的逻辑,我应该能够使用“变量”访问属性“名称”。但我做不到。当对实例的引用存储在对象类型变量中时,有人可以解释为什么以及如何访问该属性吗?

Module Program
    Sub Main()
        Dim variable As Object
        variable = New test()
        Console.WriteLine("Value: {0}   Type: {1}", variable, variable.GetType())
        'Output is Type: Object_Data_Type.test --> Works
        'However we cannot access the property name of the class TEST through "varibale"
        Console.ReadLine()
    End Sub
End Module

Public Class test
    Public Property name As String
End Class

【问题讨论】:

  • 连同提供的答案,建议尽可能避免使用基本的Object 类型。
  • 不是你做不到。这是编译器不允许使用Option Strict On。访问比引用更派生的类型的成员,例如在 Object 类型的引用上的 Test 类型的成员需要后期绑定,即在运行时才能确认它是有效的。有时需要后期绑定,但它们是非常例外的。基本上,在绝大多数情况下,没有充分的理由尝试做你正在做的事情,所以不要这样做。
  • 你应该阅读一些关于早期和晚期绑定的知识。鉴于 Option Strict Off 是 VB.NET 的默认值,所有开发人员都应该了解它们是什么以及为什么在所有情况下都应该立即转为 Option Strict On 并保留 On,除非合法需要后期绑定。

标签: vb.net


【解决方案1】:

因为 Object 没有 name 属性,并且(在外部)您的变量看起来像 Object。如果您希望它看起来像 Test ,则必须强制转换它:

Console.WriteLine("Value: {0}   Type: {1}", DirectCast(variable, Test).name, variable.GetType())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    相关资源
    最近更新 更多