我在dll文件中定义了一些类。这些都是com api。
我正在尝试动态创建其中一个类的对象,而不是设置该对象的某些属性。
当我手动设置属性时,它可以工作,但是当我尝试使用反射调用它时,它会给出错误
对象与目标类型不匹配。
以下是我的代码
Private Sub SetObjectValue(ByVal SelectedObject As SAPbobsCOM.BoObjectTypes, ByVal ClassName As String, ByVal FieldName As String, ByVal SetValue As String, ByVal KeyValue As String)
Dim oObject As Object
Dim myAssembly As Reflection.Assembly = Reflection.Assembly.LoadFrom("interop.sapbobscom.dll")
Dim myType As Type = myAssembly.GetType(ClassName)
Dim myMember() As MemberInfo = myType.GetMember(FieldName)
Dim myProperty As PropertyInfo = CType(myMember(0), PropertyInfo)
Dim myMethod As MethodInfo = myProperty.GetSetMethod
oObject = oCompany.GetBusinessObject(SelectedObject)
oObject.GetByKey(KeyValue)
myProperty.SetValue(oObject, CDbl(SetValue), Nothing)
End Sub
调用SetValue方法时会出错。相反,如果我像下面这样使用它可以正常工作:
oObject.CreditLimit = 129
oObject.Update
其中CreditLimit是给定类的属性,update是我必须在设置值后调用的方法,以便更新底层数据库中的值。
类似地,GetByKey用于从底层数据库中检索对象的值,其中必须传递主键字段的值。
由于有多个类,每个类都有很多不同的属性,因此动态调用它们会有很大的帮助。
由于 Rahul Jain
刚尝试做了casper在这里建议的内容。它给出了一个错误说 - 找不到成员。 (HRESULT异常:0x80020003(DISP_E_MEMBERNOTFOUND))
的Rahul
完成了。而不是vbSet,我使用了vbLet并且它成功完成了。
由于 拉胡
答案 0 :(得分:3)
我有点好奇为什么要这样做,因为VB会为你做所有这些。你只需要声明为类型对象,然后进行调用,或者你是否使用了一个选项(我相信它是严格的?),这会阻止你让编译器发出后期绑定调用的反射代码?
如果你需要一个参数,你也应该能够使用CallByName:
Private Sub SetObjectValue(ByVal SelectedObject As SAPbobsCOM.BoObjectTypes, ByVal ClassName As String, ByVal FieldName As String, ByVal SetValue As String, ByVal KeyValue As String)
Dim oObject As Object
oObject = oCompany.GetBusinessObject(SelectedObject)
oObject.GetByKey(KeyValue)
CallByName(oObject, FieldName, vbSet, CDbl(SetValue))
End Sub