2010-05-10 34 views
0

我試圖使用C#WinForms項目來使用後期綁定連接到由名爲Amibroker的程序提供的COM自動化API。到目前爲止,我已經能夠連接到API中的所有內容,除了一個項目,我相信這是一個基於大量谷歌搜索的「參數化屬性」。C#參數化屬性的後期綁定

這裏的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

  • +0

    @optim:您應該顯示對SetProperty的調用,因爲它很可能是使用該調用的變體。 – casperOne 2010-05-10 20:14:04

    回答

    1

    是的,COM中的屬性實現爲引擎蓋下的方法。方法名稱應該是「set_Filter」。我認爲你遇到問題的真正原因是因爲你正在通過VB6聲明。 VB6 Long類型在C#中實際上並不長,它是一個int類型。嘗試將屬性賦值爲長整型將失敗。

    在VB.NET中編寫代碼可以使它更容易,它完全支持後期綁定的方法和屬性訪問,使用類似於Java的「自然」語法。並且支持索引屬性,與C#不同。編寫一個可以在C#項目中引用的小包裝程序集。它在VS2010中也可以在C#中使用新的動態關鍵字。

    +0

    感謝Hans。你是正確的,它是最容易使用VB。我寫了一個快速的VB應用程序來設置Filter,然後我使用Reflector將它轉換回C#。我最終的結果是在我的答案中,我可以嵌入到C#類中,所以我不需要第二個DLL程序集。 感謝您的幫助! – optim 2010-05-11 14:06:27

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

    感謝大家的幫助!