我试图使用ParamArray将不同类型的参数传递给同一个函数,以模拟函数重载。
StringWorkbook对象,一个String以及一个Integer因此,用户可以向同一个函数传递不同的参数:
Function func(ParamArray params() As Variant)
blah = func("This is a string")
blah = func(wbSource, "SheetName", iRow)
是否有方法验证参数的类型?我需要确保params()包含正确类型的参数(一个workbook、一个string和一个integer)。
当然,我可以用一堆If-Else编写硬代码,但是如果将来会有更多的争论呢?我正在考虑使用TypeName()将类型转储到String数组,然后进行比较。但这似乎仍然很麻烦。是否有更好的方法来实现这一点?
顺便说一句,我不认为Optional是个好主意,因为谁知道会有多少争论呢?
发布于 2018-06-14 20:45:42
我试图使用ParamArray将不同类型的参数传递给同一个函数,以模拟函数重载。
IMO,这是个糟糕的主意:您失去了对参数计数的编译时检查,在呼叫站点上丢失了告诉您预期参数和类型的intellisense。
C#从方法重载开始,发展到支持可选参数。现在支持可选参数,在C#中,方法重载只是可选参数的一种选择,反之亦然。
VBA支持可选参数,但不支持方法重载。重要的是:您可以使用可选的参数并实现与C#替代方法重载完全相同的功能。
ParamArray不是一种选择。
“是否有方法验证参数的类型”的答案是-是的!让编译器完成它的工作!
我不认为
Optional是个好主意,因为谁知道会有多少争论呢?
如果你不知道,没人知道!一个有太多参数的方法通常是一种代码气味:方法对太多的事情负责吗?这个名字能准确地传达它所做的一切吗?很难用您提供的内容来判断,但我认为,如果您正在编写一个方法,而您不知道它需要多少参数,您如何知道该方法需要做什么?
发布于 2018-06-14 20:40:26
我想你在问题中回答了你自己的问题。您需要使用数组来存储哪些类型对您有效,并检查类型是否在其中。您可以使用TypeName(),或者使用VarType(),正如Mathieu Guindon在注释部分中解释的那样。示例:
Dim IntVar, StrVar, DateVar, MyCheck
' Initialize variables.
IntVar = 459: StrVar = "Hello World": DateVar = #2/12/69#
MyCheck = VarType(IntVar) ' Returns 2.
MyCheck = VarType(DateVar) ' Returns 7.
MyCheck = VarType(StrVar) ' Returns 8.https://stackoverflow.com/questions/50865495
复制相似问题