문제

DLL 파일에 정의 된 일부 클래스. 이들은 COM API의 형태입니다.

나는 클래스 중 하나의 객체를 동적으로 그리고 해당 객체의 속성을 설정하는 것보다 만들려고 노력하고 있습니다.

속성을 수동으로 설정하면 작동하지만 반사를 사용하여 동일하게 호출하려고하면 오류가 발생합니다.

객체는 대상 유형과 일치하지 않습니다.

다음은 내 코드입니다

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이 주어진 클래스의 속성이며 업데이트는 값을 설정 한 후에 전화 해야하는 메소드입니다. 따라서 기본 데이터베이스의 값이 업데이트됩니다.

마찬가지로 GetBykey는 기본 키 필드의 값을 전달 해야하는 기본 데이터베이스에서 객체의 값을 검색하는 데 사용됩니다.

여러 클래스가 있고 각 클래스마다 다양한 속성이 있으므로 동적으로 부르는 데 도움이됩니다.

Rahul Jain 감사합니다

캐스퍼가 여기에서 제안한 것을 시도했습니다. 멤버를 찾을 수없는 오류가 발생합니다. (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