GetType()显示不存在的类型?

时间:2016-03-02 09:52:49

标签: vb.net

在我试图弄清楚如何使用Siemens Tia Portal Openness框架时,我尝试使用ControllerTarget类型在我的Tia Portal项目中找到一个项目。

我试着找到这样的项目:

Imports Siemens.Engineering
Imports Siemens.Engineering.HW

Module Module1

Sub Main()
    Dim myTiaPortal
    myTiaPortal = New TiaPortal(TiaPortalMode.WithoutUserInterface)

    'The portal is open, now create a project.
    Dim tiaProject As Project

    'Open the sample project:
    Dim fileName As String
    fileName = "C:\Path\To\Project\Sample_Project.ap13"
    tiaProject = myTiaPortal.Projects.Open(fileName)

    'Get the frist device from the project:
    Dim tiaDevice As Device
    tiaDevice = tiaProject.Devices.First

    For Each item As IDeviceItem In tiaDevice.DeviceItems
        Console.WriteLine(item.GetType())
    Next
    Console.ReadKey()
End Sub

End Module

这显示了项目中的两个项目:

Siemens.Engineering.HW.DeviceItemImplementation
Siemens.Engineering.HW.ControllerTargetImplementation

当我尝试定义ControllerTargetImplementation类型的对象时,我收到此数据类型不存在的消息。

当我尝试将ControllerTargetImplementation类型的项目转换为ControllerTarget类型的对象时,这似乎完美无缺。

这是否意味着GetType()返回的类型不必与对象的实际类型相同?这是正常的吗?或者这在开放平台上是一件奇怪的事情吗?

1 个答案:

答案 0 :(得分:2)

  

当我尝试定义ControllerTargetImplementation类型的对象时,我收到此数据类型不存在的消息。

类型可以是程序集的内部,这意味着虽然它们存在,而GetType之类的东西会显示它们,但是你不能直接使用它们。

  

当我尝试将ControllerTargetImplementation类型的项目转换为ControllerTarget类型的对象时,这似乎完美无缺。

鉴于这里涉及的名称,它肯定听起来ControllerTarget是向您(库的使用者)公开的类型,而该类型的实现,可能是接口的子类或实现(即是ControllerTarget一个类或接口?)是隐藏的,因为你不需要知道它是如何工作的,也不会干扰它。

  

这是否意味着GetType()返回的类型不必与对象的实际类型相同?

对象的实际类型是GetType报告的内容,但这并不意味着它必然是您所指的那样。例如,请考虑以下事项:

Class A

End Class

Class B
Inherits A

End Class

Sub Main
    Dim obj as A = new B()
    Console.WriteLine(obj.GetType())
End Sub

这会将obj报告为B类型(因为这是我们使用new B()实例化的实际类型),即使它是针对{{1}类型的变量存储的}。