Methode invoke dynamisch in VB.Net
-
03-07-2019 - |
Frage
Ich habe einige Klassen in einer DLL-Datei definiert. Diese sind in Form von com api.
Ich versuche, ein Objekt eines der Klasse dynamisch zu erstellen und als eine Eigenschaft des Objekts festlegen.
Wenn ich die Eigenschaft manuell festlegen, es funktioniert, aber wenn ich versuche, das gleiche mit Reflexion aufrufen es gibt den Fehler, dass
Objekt nicht Zieltyp entsprechen.
Im Anschluss an meinem 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
Es gibt die Fehlermeldung, wenn SetValue-Methode aufgerufen wird. Stattdessen, wenn ich diese verwenden wie folgt es funktioniert:
oObject.CreditLimit = 129
oObject.Update
Wo Kreditgrenze ist eine Eigenschaft der gegebenen Klasse und zu aktualisieren ist eine Methode, die ich anrufen, nachdem der Wert eingestellt ist, so dass der Wert der zugrunde liegende Datenbank aktualisiert wird.
In ähnlicher GetByKey wird verwendet, um den Wert des Objekts aus der zugrunde liegenden Datenbank abgerufen werden, wobei der Wert des Primärschlüsselfeldes hat weitergegeben werden.
Da gibt es mehrere Klassen und jede Klasse hat viele verschiedene Eigenschaften, daher sie dynamisch Aufruf wird eine Menge helfen.
Danke Rahul Jain
Gerade versucht zu tun, was casper hier vorgeschlagen hat. Es gibt eine Fehlermeldung, - Mitglied nicht gefunden. (Ausnahme von HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND))
Rahul
Seine getan. Statt vbSet, benutzte ich vbLet und es wurde erfolgreich abgeschlossen.
Danke Rahul
Lösung
Ich bin ein bisschen neugierig, warum Sie dies tun, als VB wird für Sie alle es tun. Sie müssen einfach nur als Typ Objekt deklarieren und dann den Anruf tätigen, oder verwenden Sie eine Option (ich glaube, es streng ist?), Die Sie aus der Vermietung der Compiler den Code für Reflexions spät gebundene Anrufe emittieren verhindert?
Wenn Sie einen Parameter nehmen müssen, sollten Sie in der Lage sein CallByName als auch zu verwenden:
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