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

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top