Invoquer la méthode dynamiquement dans VB.Net
-
03-07-2019 - |
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
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