2009-01-02 57 views
1

我在dll文件中定義了一些類。這些以com api的形式出現。在VB.Net中動態調用方法

我想創建一個類的對象動態和設置該對象的某些屬性。

當我手動設置的屬性,它的工作原理,但是當我嘗試調用使用反射同它給人的錯誤

對象不匹配目標類型。

以下是我的代碼

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是給定類的屬性,以及更新,我有打電話,該值設置之後,這樣的方法的價值在底層數據庫中更新。

同樣,GetByKey用於從基礎數據庫中檢索對象的值,其中必須傳遞主鍵字段的值。

由於有多個類,每個類都有很多不同的屬性,因此動態調用它們將有很大幫助。

感謝 拉胡爾·哈因

只是試圖做什麼卡斯帕在這裏建議。它給出了一個錯誤說 - 找不到會員。 (異常來自HRESULT:0x80020003(DISP_E_MEMBERNOTFOUND))

拉胡爾

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

感謝 拉胡爾

+0

有什麼CREDITLIMIT屬性的類型? – 2009-01-02 19:19:47

回答

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