我想在一个集合中获取一个对象作为字符串,而不用为其调用函数。 例如。: 在Java中,我可以
System.out.print(objVarXY)
并且编译器将自动调用objVarXY.toString()函数(如果已实现)
在VBA中是这样的
Debug.Print parameterListe.LList.Item(1)
将导致错误。
Debug.Print parameterListe.LList.Item(1).toString
如果我实现了toString子函数,将起作用。 但是,如果我不知道LList集合中将包含哪种对象?
答案 0 :(得分:3)
Debug.Print
将隐式尝试将给定的值表达式强制转换为String
以便输出。
当您Debug.Print
对象时,VBA会尝试Let
将对象强制为一个值-如果对象没有默认成员,最终会产生一个可以隐式转换为String
的值,那么如果类没有默认成员,则会出现运行时错误438“对象不支持此属性或方法”
如果对象是用户代码(即您自己的类模块),并且这样做有意义,则您可以自己添加一个默认成员,并让该类负责知道如何将自己表示为{{1 }}(请注意,VB属性隐藏在VBE代码窗格中,并且必须在VBE外部进行编辑-除非您使用Rubberduck,在这种情况下,您可以简单地添加String
注释和同步注释/属性):
@DefaultMember
但是,所有这些操作通过隐式成员调用,使该类实际上具有被视为'@DefaultMember
Public Function ToString() As String
Attribute ToString.VB_UserMemId = 0
'...
End Function
的能力。我将其称为一种滥用语言功能(通过这种机制,String
输出应用程序的Debug.Print Excel.Application
,或Name
输出连接的Debug.Print adoConnection
属性),因为正如您指出的,您最好只显式调用该ConnectionString
方法。
如果对象不知道如何将自己表示为ToString
,则必须某处某处。在Java(IIRC)和.NET中,这实际上是默认的String
实现:
ToString
...这是没有用的,但是实际上Debug.Print TypeName(objVarXY)
就是默认情况下的工作。
无论您是在编写Java,C#还是VBA,都需要编写代码来了解如何将ToString
表示为objVarXY
。
遗憾的是,VBA不会执行fantpant模式匹配,因此我们无法像C#中那样String
(它只是最近才具备这种功能-不了解Java),并且由于Select Case TypeOf obj
不会不是类型安全的,我会选择Select Case TypeName(obj)
:
If...ElseIf
显然,如果集合始终包含您拥有的类,则更好的解决方案是让每个对象都知道如何将自己表示为Public Function Stringify(ByVal obj As Object) As String
If TypeOf obj Is Something Then
Dim objSomething As Something
Set objSomething = obj ' cast to Something interface
Stringify = objSomething.SomeProperty
ElseIf TypeOf obj Is SomethingElse Then
Dim objSomethingElse As SomethingElse
Set objSomethingElse = obj ' cast to SomethingElse interface
Stringify = objSomethingElse.AnotherProperty & "[" & objSomethingElse.Foo & "]"
'ElseIf TypeOf obj Is ... Then
' ...
Else
' we don't know what the type is; return the type name.
Stringify = TypeName(obj)
End If
End Function
值。
但是,让用户类在其默认界面上公开String
方法是不理想的:由于我们不知道从集合中获得什么类型,因此我们具有ToString
和一个后期绑定调用-并且没有编译时保证该类实现了Object
方法,并且如果我们尝试调用ToString
也没有编译器警告。
解决方案是不将ToStrnig
放在类的默认接口上,并使用某些ToString
类模块来将行为形式化,如下所示:>
IString
是的,这就是整个课堂。
现在需要以字符串表示的用户类可以执行以下操作:
Option Explicit
Public Function ToString() As String
End Funtion
现在我们可以尽早保证对象具有Option Explicit
Implements IString
Private Function IString_ToString() As String
' todo: implement the method!
End Function
方法:
ToString
一天结束时,无论您使用哪种语言,都没有魔力。
答案 1 :(得分:1)
VBA中不存在类似的东西,例如只有CStr()
之类的Type conversion functions才能转换。 Integer
变成String
。
如果您需要将Collection
转换为Array
,则需要使用一个函数。
但是,如果我不知道我的
,该怎么办?LList
集合中将包含哪种对象
然后,您将需要确定它是哪个对象(您可能希望有5个可能的对象),并对每种不同的对象类型执行类似Select Case
的操作,以将其转换为String
。