验证 ParamArray 是否包含正确类型的参数
Validate that ParamArray contains the right types of parameters
我正在尝试使用 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
数组,然后进行比较。但这似乎仍然很麻烦。有没有更好的方法来实现这个?
顺便说一句,我认为 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?
如果你不这样做,没人知道!带有太多参数的方法通常是一种代码味道:该方法是否负责太多事情?这个名字是否准确地表达了它所做的一切?很难用你提供的东西来判断,但我认为如果你正在编写一个方法并且你不知道它需要多少参数,你怎么知道该方法需要什么 做?
我正在尝试使用 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
数组,然后进行比较。但这似乎仍然很麻烦。有没有更好的方法来实现这个?
顺便说一句,我认为 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?
如果你不这样做,没人知道!带有太多参数的方法通常是一种代码味道:该方法是否负责太多事情?这个名字是否准确地表达了它所做的一切?很难用你提供的东西来判断,但我认为如果你正在编写一个方法并且你不知道它需要多少参数,你怎么知道该方法需要什么 做?