验证 ParamArray 是否包含正确类型的参数

Validate that ParamArray contains the right types of parameters

我正在尝试使用 ParamArray 将不同类型的参数传递给同一个函数以模仿 函数重载

所以用户可以将不同的参数传递给同一个函数:

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 不是个好主意,因为谁知道会有多少争论?

我想你在问题中回答了你自己的问题。您需要使用一个数组来存储哪些类型对您有效,并检查该类型是否在里面。您可以使用 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.

I'm trying to use ParamArray to pass different kinds of parameters to the same function to mimic Function Overloading.

IMO 这是一个糟糕的想法:你失去了对参数计数的编译时检查,失去了调用站点的智能感知,告诉你预期的参数和类型是什么。

C# 从方法重载开始,逐渐发展到支持可选参数。现在支持可选参数,方法重载在 C# 中只是可选参数的替代方法,反之亦然。

VBA 支持可选参数,但不支持方法重载。重要的是:您可以使用可选参数并实现与 C# 替代方法重载完全相同的效果。

ParamArray 不是一个选项。

"is there a way to validate the types of the arguments" 的答案是 - 是!让编译器完成它的工作!

I don't think Optional is a good idea because who knows how many arguments there will be?

如果你不这样做,没人知道!带有太多参数的方法通常是一种代码味道:该方法是否负责太多事情?这个名字是否准确地表达了它所做的一切?很难用你提供的东西来判断,但我认为如果你正在编写一个方法并且你不知道它需要多少参数,你怎么知道该方法需要什么 ?