2009-01-02 7 views
1

J'ai certaines classes définies dans un fichier dll. Ceux-ci sont sous la forme de com api. J'essaie de créer dynamiquement un objet de la classe et de définir une propriété de cet objet.Invoke méthode dynamiquement dans VB.Net

Quand je mis la propriété manuellement, cela fonctionne, mais lorsque je tente d'invoquer la même chose en utilisant la réflexion, il donne l'erreur que

objet ne correspond pas au type de cible.

Après 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 

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

oObject.CreditLimit = 129 
oObject.Update 

Où CreditLimit est une propriété de la classe donnée, et la mise à jour est une méthode que je dois appeler, après que la valeur est réglée, de sorte que la valeur La base de données sous-jacente est mise à jour

De même GetByKey est utilisé pour récupérer la valeur de l'objet de la base de données sous-jacente, où la valeur du champ de clé primaire doit être transmise.

Puisqu'il existe plusieurs classes et que chaque classe a beaucoup de propriétés différentes, les appeler dynamiquement vous aidera beaucoup.

Merci Rahul Jain

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

Rahul

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

Merci Rahul

+0

Quel est le type de la propriété CreditLimit? –

+0

Son double. J'ai vérifié avec cela aussi, au lieu de chaîne, si je passe une valeur double, il donne la même erreur. –

Répondre

3

Je suis un peu curieux de savoir pourquoi vous faites cela, comme VB fera tout pour vous. Vous devez simplement déclarer en tant qu'objet de type et faire 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 en retard?

Si vous devez prendre un paramètre, vous devriez être en mesure d'utiliser CallByName ainsi:

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 
Questions connexes