【问题标题】:C# Late Binding for Parameterized Property参数化属性的 C# 后期绑定
【发布时间】:2011-02-17 20:43:00
【问题描述】:

我正在尝试使用后期绑定连接到一个名为 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 sn-p 如下所示:

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

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

丹尼尔

【问题讨论】:

  • @optim:您应该显示对 SetProperty 的调用,因为它很可能是使用它的调用的变体。

标签: c# com parameters properties late-binding


【解决方案1】:

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

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

【讨论】:

  • 谢谢汉斯。你说得对,使用 VB 是最简单的。我编写了一个快速的 VB 应用程序来设置过滤器,然后我使用反射器将其转换回 C#。我最终得到的是我的答案帖子,我可以将其嵌入到我的 C# 类中,因此我不需要第二个 DLL 程序集。感谢您的帮助!
【解决方案2】:

这是转换为 C# 的 VB 代码。它不适合 Hans 的 cmets。

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

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多