如果我有一个可能返回对象或原始类型的函数-在其中,我可以执行以下操作来处理这两种情况:
openModal() {
const myModalOptions: ModalOptions = {
enableBackdropDismiss: true,
showBackdrop:true
};
const myModal: Modal = this.modal.create(ModaltestComponent,myModalOptions);
myModal.present();
myModal.onDidDismiss((data) => {
console.log("I have dismissed.");
});
但是,如何对存储Function Result() As Variant 'may be object or not
'... get item - the return value
If IsObject(item) Then
Set Result = item
Else
Result = item
End If
End Function
的变量执行相同的测试,而无需两次运行该函数?例如
Result
为
Dim myResult As Variant
If IsObject(Result) Then 'test return type of function
Set myResult = Result
Else
myResult = Result
End If
我正在尝试将一系列对象/非对象写入变量类型的数组
答案 0 :(得分:3)
一种可行的解决方案是通过传递变量ByRef
直接写入变量。这样Function
就没有返回值,因此可以变成Sub
:
Sub Result(ByRef writeTo As Variant)
'... get item - the return value
If IsObject(item) Then
Set writeTo = item
Else
writeTo = item
End If
End Sub
称为
Dim myResult As Variant
Result myResult 'overwrites whatever writeTo contains
答案 1 :(得分:1)
例如,来自一个类的片段,该片段动态处理调用类的函数。如果可以基于RubberDuck Reflection API实现一些基本的VBA反射,则正在进行原型制作。当我动态地调用类和模块函数时,没有可靠的方法可以提前知道是否从函数调用中返回基元或对象类型。
请注意,我尚未测试代码,因此需要在InvokeMember函数中添加一些错误处理。
Greedo的解决方案类似,期望函数结果通过引用是一个单独的参数,这种方式可以放入例如函数调用中。 CallByName作为第二个参数。第一个参数是存储引用调用结果的变量。函数结果参数y是通过引用引用的,因为可能会生成一个数组,并且避免传入时将整个数组复制到内存中。
Public Function InvokeMember(ByVal obj As Object, ParamArray args() As Variant) As Variant
Assign InvokeMember, CallByName(obj, Me.FullName, Me.CallType, args)
End Function
在一个模块中,来自VBA Extension Library
的代码' Assign x to y regardless of object or primitive
Public Sub Assign(ByRef x as Variant, ByRef y as Variant)
If IsObject(y) Then
Set x = y
Else
x = y
End If
End Sub
感谢这个问题,它帮助我解决了相同的问题,避免在处理返回的对象,数组或原始数据类型时两次调用同一函数。
答案 2 :(得分:0)
另一种解决方案是使用Array()函数并将函数或属性输出包装在其中。
当我测试原始解决方案时,从内存中来看,它不适用于仅来自类属性的值起作用的地方。使用接口或直接使用属性并获取变体结果时,这是一个问题。
注意:我认为这不适用于返回UDT或固定字符串长度的函数/属性。
在您的示例中使用以下内容:
Dim myResult As Variant
Dim resultOutput as Variant
resultOutput = Array(Result)
If VBA.IsObject(resultOutput(0)) Then
set myResult = resultOutput(0)
Else
myResult = resultOutput(0)
End If