这是一个非常新手的问题,但因为我花了一个下午尝试并且没有任何想法,我想我会在Stackoverflow上发布它。
我正在构建一个从开源API中提取数据的程序。我还是初学者,所以我尝试慢慢调整数据,以便按照我想要的方式显示。但是,我收到错误“名称'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
}
}
}
乍一看,解决方案很简单:
但是,由于提供此选项数据的API接口的限制,两个选项都不可能。我怎么解决这个问题?也许我甚至需要丢弃班级测试员并找到另一种方式?
答案 0 :(得分:1)
最简单的方法是将方法放在一个类中。 看看你的设计,看看哪个对象应该包含这样的方法,然后把它放在那里。我们的想法是创建一个将注册到事件的对象实例。
让我们说Blah会拥有这个方法:
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();
}
答案 1 :(得分: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);
}