Question

J'ai des classes définies dans un fichier dll. Ce sont sous la forme de com api.

J'essaie de créer un objet d'une classe de manière dynamique et de définir une propriété de cet objet.

Lorsque je définis la propriété manuellement, cela fonctionne, mais lorsque j'essaie d'invoquer la même chose en utilisant la réflexion, cela donne l'erreur

L'objet ne correspond pas au type de cible.

Voici mon code

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

Cela donne l'erreur quand la méthode SetValue est appelée. Au lieu de cela, si j'utilise ceci comme suit, cela fonctionne très bien:

oObject.CreditLimit = 129
oObject.Update

Où CreditLimit est une propriété de la classe donnée et update est une méthode que je dois appeler une fois la valeur définie pour que la valeur de la base de données sous-jacente soit mise à jour.

De même, GetByKey est utilisé pour extraire la valeur de l'objet de la base de données sous-jacente, la valeur du champ de clé primaire devant être passée.

Puisqu'il y a plusieurs classes et que chaque classe a beaucoup de propriétés différentes, leur appel dynamique aidera beaucoup.

Merci Rahul Jain

J'ai juste essayé de faire ce que Casper a suggéré ici. Cela donne une erreur en disant - Membre non trouvé. (Exception de HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND))

Rahul

  

C'est fait. Au lieu de vbSet, j’ai utilisé vbLet et tout s’est terminé avec succès.

     

Merci   Rahul

Était-ce utile?

La solution

Je suis un peu curieux de savoir pourquoi vous faites cela, car VB fera tout pour vous. Vous devez simplement déclarer en tant qu'objet type et ensuite effectuer l'appel, ou utilisez-vous une option (je crois que c'est strict?) Qui vous empêche de laisser le compilateur émettre le code de réflexion pour les appels tardifs?

Si vous devez prendre un paramètre, vous devriez également pouvoir utiliser 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top