C#参数化属性的后期绑定

时间:2010-05-10 20:07:18

标签: c# com parameters properties late-binding

我正在尝试使用后期绑定连接到由名为Amibroker的程序提供的COM自动化API,使用C#WinForms项目。到目前为止,我已经能够连接到API中的所有内容,除了一个项目,我相信它是基于广泛谷歌搜索的“参数化属性”。

根据文档(此处为完整版:http://www.amibroker.com/guide/objects.html),以下是API规范的外观:

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#代码的原型会是什么样的呢?

希望这能解释得很好,但随时可以问我是否遗漏了任何不清楚的内容。在此先感谢您的帮助!

丹尼尔

2 个答案:

答案 0 :(得分:1)

是的,COM中的属性是作为方法实现的。方法名称应为“set_Filter”。我认为你遇到问题的真正原因是因为你要通过VB6声明。 VB6 Long类型在C#中实际上并不长,它是一个int。尝试使用long值分配属性将失败。

在VB.NET中编写此代码可以使 lot 更容易,它完全支持后期绑定方法和属性访问,使用类似于Java的“自然”语法。并且支持索引属性,与C#不同。编写一个可以在C#项目中引用的小包装程序集。自VS2010以来,它也可以在C#中使用新的动态关键字。

答案 1 :(得分:0)

这是转换为C#的VB代码。它不符合汉斯的评论。

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);

感谢大家的帮助!