1

我在 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 用于从底层数据库中检索对象的值,其中必须传递主键字段的值。

由于有多个类,每个类都有很多不同的属性,因此动态调用它们会有很大帮助。

谢谢拉胡尔耆那教

刚刚尝试做 casper 在这里建议的事情。它给出了一个错误消息 - 找不到成员。(来自 HRESULT 的异常:0x80020003 (DISP_E_MEMBERNOTFOUND))

拉胡尔

完成。我使用 vbLet 而不是 vbSet,它成功完成。

谢谢拉胡尔

4

1 回答 1

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
于 2009-01-02T19:34:46.890 回答