Динамически вызывать метод в VB.Net - PullRequest
1 голос
/ 02 января 2009

У меня есть некоторые классы, определенные в файле DLL. Они в форме ком апи.

Я пытаюсь создать объект одного из классов динамически, а затем установить какое-либо свойство этого объекта.

Когда я устанавливаю свойство вручную, оно работает, но когда я пытаюсь вызвать то же самое с помощью отражения, оно выдает ошибку,

Объект не соответствует типу цели.

Ниже мой код

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, и он успешно завершился.

Спасибо Рахул

1 Ответ

3 голосов
/ 02 января 2009

Мне любопытно, почему вы делаете это, так как 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
...