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

时间:2018-06-14 20:32:18

标签: vba paramarray

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

  • 一个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数组,然后进行比较。但这似乎仍然很麻烦。有没有更好的方法来实现这一目标?

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

2 个答案:

答案 0 :(得分:3)

  

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

IMO这是一个可怕的想法:你失去了对参数计数的编译时间检查,在呼叫站点失去智能感知告诉你预期的参数&类型是。

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

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

Optional不是一种选择。

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

  

我认为SELECT sql FROM sqlite_master WHERE name = 'mytable' AND type = 'table'; 不是一个好主意,因为谁知道会有多少参数?

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

答案 1 :(得分:1)

我认为您在问题中回答了自己的问题。您需要使用数组来存储哪些类型对您有效并检查类型是否在内部。正如Mathieu Guindon在评论部分中所解释的那样,您可以使用TypeName()或使用VarType()。例如:

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.