Domanda

Ho alcune classi definite in un file dll. Questi sono in forma di API.

Sto cercando di creare dinamicamente un oggetto di una classe e di impostare alcune proprietà di quell'oggetto.

Quando imposto manualmente la proprietà, funziona, ma quando provo a invocare la stessa utilizzando la riflessione dà l'errore che

L'oggetto non corrisponde al tipo di destinazione.

Segue il mio codice

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

Fornisce l'errore quando viene chiamato il metodo SetValue. Invece, se uso questo come segue, funziona bene:

oObject.CreditLimit = 129
oObject.Update

Dove CreditLimit è una proprietà di una determinata classe e update è un metodo che devo chiamare, dopo aver impostato il valore, in modo che il valore nel database sottostante sia aggiornato.

Allo stesso modo GetByKey viene utilizzato per recuperare il valore dell'oggetto dal database sottostante, dove deve essere passato il valore del campo chiave primaria.

Poiché ci sono più classi e ogni classe ha molte proprietà diverse, quindi chiamarle dinamicamente aiuterà molto.

Grazie Rahul Jain

Ho appena provato a fare ciò che Casper ha suggerito qui. Fornisce un errore che dice: membro non trovato. (Eccezione da HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND))

Rahul

  

È fatto. Invece di vbSet, ho usato vbLet ed è stato completato correttamente.

     

Grazie   Rahul

È stato utile?

Soluzione

Sono curioso di sapere perché lo stai facendo, poiché VB farà tutto per te. Devi semplicemente dichiarare come oggetto tipo e quindi effettuare la chiamata, oppure stai utilizzando un'opzione (credo sia rigorosa?) Che ti impedisce di consentire al compilatore di emettere il codice di riflessione per le chiamate in ritardo?

Se devi prendere un parametro, dovresti essere in grado di usare anche 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top