【问题标题】:Invoke method dynamically in VB.Net在 VB.Net 中动态调用方法
【发布时间】:2010-09-29 07:07:10
【问题描述】:

我在 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 是给定类的属性,update 是我必须在设置值后调用的方法,以便更新底层数据库中的值。

GetByKey 类似地用于从底层数据库中检索对象的值,其中必须传递主键字段的值。

由于有多个类,每个类都有很多不同的属性,因此动态调用它们会有很大帮助。

谢谢 拉胡尔耆那教

刚刚尝试按照 casper 的建议进行操作。它给出了一个错误消息 - 找不到成员。 (来自 HRESULT 的异常:0x80020003 (DISP_E_MEMBERNOTFOUND))

拉胡尔

完成了。我没有使用 vbSet,而是使用了 vbLet,它成功完成了。

谢谢 拉胡尔

【问题讨论】:

  • CreditLimit 属性的类型是什么?
  • 它的双倍。我也检查过,而不是字符串,如果我传递一个双精度值,它会给出相同的错误。

标签: vb.net reflection dynamic sapb1


【解决方案1】:

我有点好奇您为什么要这样做,因为 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

【讨论】:

    猜你喜欢
    • 2012-01-22
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    相关资源
    最近更新 更多