1

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 を使用したところ、正常に完了しました。

ありがとうラフル

4

1 に答える 1

3

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
于 2009-01-02T19:34:46.890 に答える