2

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

  • 一单String
  • 一个Workbook对象,一个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一个好主意,因为谁知道会有多少争论?

4

2 回答 2

3

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

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

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

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

ParamArray不是一个选择。

“有没有办法验证参数的类型”的答案是 -是的!让编译器完成它的工作!

我认为这不是Optional一个好主意,因为谁知道会有多少争论?

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

于 2018-06-14T20:45:42.083 回答
1

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