Позднее связывание C # для параметризованного свойства - PullRequest
0 голосов
/ 11 мая 2010

Я пытаюсь использовать позднюю привязку для подключения к API автоматизации COM, предоставляемому программой Amibroker, с использованием проекта C # WinForms. До сих пор я был в состоянии соединиться со всем в API, кроме одного элемента, который я считаю «параметризованным свойством», основанным на обширном поиске в Google.

Вот как выглядит спецификация API в соответствии с документацией (Полная версия здесь: http://www.amibroker.com/guide/objects.html):

Property Filter(ByVal nType  As Integer, ByVal pszCategory As String) As Long [r/w]

Фрагмент JavaScript для обновления значения выглядит следующим образом:

AB = new ActiveXObject("Broker.Application");
AA = AB.Analysis;
AA.Filter( 0, "market" ) = 0;

Используя следующий код поздней привязки C #, я могу получить значение свойства, но я не могу понять, как установить значение :

object[] parameter = new object[2];
parameter[0] = Number;
parameter[1] = Type;
object filters = _analysis.GetType().InvokeMember("Filter", BindingFlags.GetProperty, null, _analysis, parameter);

Пока я пробовал:

  • с использованием BindingFlags.SetProperty, BindingFlags.SetField
  • приведение возвращенного объекта к объекту PropertyInfo и попытка обновить значение, используя его
  • добавление дополнительного объекта, содержащего значение, к объекту параметров
  • различные другие вещи как последние усилия

Из того, что я вижу, это должно быть просто, но я считаю, что поздняя привязка в C # в лучшем случае громоздка. Свойство выглядит как вызов метода для меня, и это меня отталкивает. Как можно присвоить значение методу и как будет выглядеть прототип для кода C # с поздним связыванием?

Надеюсь, это объясняет это достаточно хорошо, но не стесняйтесь спрашивать, оставил ли я что-то неясное. Заранее спасибо за любую помощь!

Daniel

Ответы [ 2 ]

1 голос
/ 11 мая 2010

Да, свойства в COM реализованы как методы под капотом. Имя метода должно быть "set_Filter". Я считаю, что настоящая причина, по которой у вас возникла проблема, заключается в том, что вы соблюдаете декларации VB6. Тип VB6 Long на самом деле не длинный в C #, это int. Попытка присвоить свойству длинное значение завершится неудачей.

Написание этого кода в VB.NET может упростить лот , он полностью поддерживает метод с поздним связыванием и доступ к свойствам, используя «естественный» синтаксис, подобный Java. И поддерживает индексированные свойства, в отличие от C #. Напишите небольшую сборку оболочки, на которую вы можете ссылаться в своем проекте C #. Он также доступен в C # начиная с VS2010 с новым ключевым словом dynamic .

0 голосов
/ 11 мая 2010

Вот код VB, который преобразован в C #. Это не помещалось в комментариях к Гансу.

object x = RuntimeHelpers.GetObjectValue(Interaction.CreateObject("Broker.Application", ""));
NewLateBinding.LateSetComplex(NewLateBinding.LateGet(x, null, "Analysis", new object[0], null, null, null), null, "Filter", new object[] { 0, "market", 0x22 }, null, null, false, true);

Спасибо всем за помощь!

...