2010-12-23 89 views
0

這是一個相當新手的問題,但是因爲我花了一個下午的時間嘗試並且沒有任何想法,我以爲我把它發佈在Stackoverflow上。在當前上下文中找不到名稱

我正在構建一個從開源API中提取數據的程序。我仍然是初學者,所以我試着慢慢調整數據,以便以我想要的方式顯示。但是,我收到錯誤「The name'MyOptionChainsInput'在當前上下文中不存在」,並且不知道如何解決它。

我的目標是要在'contract_details'中填充一個列表,使得列表可以在其他方法中訪問(例如在Main()中,我的屬性尚未做到)。

我的代碼

using System; 
using System.Collections.Generic; 
using System.Text; 
using Krs.Ats.IBNet; 
using System.Threading; 
using Krs.Ats.IBNet.Contracts; 

namespace Krs.Ats.TestApp 
{ 
public class Tester 
{ 
    List<double> optionChainStrikes = new List<double>(); 
    List<string> optionChainExpiration = new List<string>(); 

    // properties 
    public List<double> OptionChainStrikes 
    { 
     get 
     { 
      return optionChainStrikes; 
     } 
     set 
     { 
      value = optionChainStrikes; 
     } 
    } 
    public List<string> OptionChainExpiration 
    { 
     get 
     { 
      return optionChainExpiration; 
     } 
     set 
     { 
      value = optionChainExpiration; 
     } 
    } 

    public void MyOptionChainsInput(string expirationDate, double strike) 
    { 
     optionChainExpiration.Add(expirationDate); 
     optionChainStrikes.Add(strike); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     // Commented code 
     client.ContractDetails += contract_details; 
     // Because of this line, the method 'contract_details' (see below) has to be static. 

     // Output the info of the option chains (This works and is an option, however, is it the best way?) 
     Tester t = new Tester(); 
     t.MyOptionChainOutput(); 
    } 

    static void contract_details(object sender, ContractDetailsEventArgs e) // This method has to be static. 
    { 
     //Tester t = new Tester(); // This creates on each call an new Tester instances, which also deletes the list. 
     //t.MyOptionChainsInput(e.ContractDetails.Summary.Expiry, e.ContractDetails.Summary.Strike); 
     MyOptionChainsInput(e.ContractDetails.Summary.Expiry, e.ContractDetails.Summary.Strike); // this doesn't work either 
    } 
} 
} 

乍一看,解決方法很簡單:

  • 製作方法 'contract_details' 公開,這樣它可以訪問 'MyOptionsChainInput' 的方法,或
  • 在'contract_details'中創建一個新的Tester實例,然後訪問MyOptionsChainInput。

但是,由於提供此選項數據的API接口的限制,兩個選項都是不可能的。我該如何解決這個問題?也許我甚至需要放棄測試人員並找到另一種方式?

回答

1

所以,保持測試儀的靜態實例左右。

 
    // keep a static instance around 
    static Tester tester = new Tester(); 
    static void contract_details(object sender, ContractDetailsEventArgs e) // This method has to be static. 
    { 
     // call the method on the static instance          
        tester.MyOptionChainsInput(e.ContractDetails.Summary.Expiry, e.ContractDetails.Summary.Strike); 
     } 

+0

感謝您的回覆。我試過了,但是因爲API程序爲每一行新數據調用'contract_details'方法,所以我的測試程序在每次調用時都會被重寫,導致列表永遠不會被填充。 :) – Jura25 2010-12-23 17:44:53

1

最簡單的方法是將該方法放在一個類中。 看看你的設計,看看哪個對象應該包含這樣一種方法,並把它放在那裏。這個想法是創建一個將註冊到事件的對象的實例。

比方說,類布拉赫將自己的方法:

static void Main(string[] args) 
    { 
     // Commented code 
     Blah temp = new Blah(); 
     client.ContractDetails += temp.contract_details; 
     // Because of this line, the method 'contract_details' (see below) has to be static. 

     // Output the info of the option chains (This works and is an option, however, is it the best way?) 
     Tester t = new Tester(); 
     t.MyOptionChainOutput(); 
    } 
+0

感謝您的快速回復。我不認爲我完全理解你。我已經將該方法放在類中(MyOptionsChainInput駐留在類Tester中)。方法'contract_details'不能被移動,因爲API使用它來補充ContractDetails()方法。還是我需要除了Tester類之外的新班級Blah? – Jura25 2010-12-23 17:49:15

相關問題