0

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

根据文档,这是 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# 代码的原型会是什么样子?

希望这可以很好地解释它,但请随时询问我是否有任何不清楚的地方。提前感谢您的帮助!

丹尼尔

4

2 回答 2

1

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

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

于 2010-05-10T21:41:23.187 回答
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);

感谢大家的帮助!

于 2010-05-11T14:09:01.170 回答