質問

dllファイルでいくつかのクラスを定義しました。これらはcom apiの形式です。

クラスの1つのオブジェクトを動的に作成し、そのオブジェクトのプロパティを設定しようとしています。

プロパティを手動で設定すると機能しますが、リフレクションを使用して同じものを呼び出そうとすると、エラーが発生します

オブジェクトはターゲットタイプと一致しません。

以下は私のコードです

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

SetValueメソッドが呼び出されるとエラーが発生します。代わりに、次のようにこれを使用するとうまくいきます:

oObject.CreditLimit = 129
oObject.Update

CreditLimitは指定されたクラスのプロパティであり、updateは、値が設定された後に呼び出す必要があるメソッドです。そのため、基になるデータベースの値が更新されます。

同様に、GetByKeyは、主キーフィールドの値を渡す必要がある基になるデータベースからオブジェクトの値を取得するために使用されます。

複数のクラスがあり、各クラスには多くの異なるプロパティがあるため、それらを動的に呼び出すと非常に役立ちます。

ありがとう ラーフル・ジャイン

ここでキャスパーが示唆したことをやってみました。 「メンバーが見つかりません」というエラーが表示されます。 (HRESULTからの例外:0x80020003(DISP_E_MEMBERNOTFOUND))

ラーフル

  

完了しました。 vbSetの代わりにvbLetを使用し、正常に完了しました。

     

ありがとう   ラーフル

役に立ちましたか?

解決

VBがすべてあなたのためにやってくれるので、なぜあなたがこれをしているのか不思議です。型オブジェクトとして宣言してから呼び出しを行う必要がありますか、それともコンパイラーが遅延バインディング呼び出しのリフレクションコードを発行できないようにするオプションを使用していますか(厳密だと思いますか?)

パラメーターを取得する必要がある場合は、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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top