在当前上下文中找不到名称

时间:2010-12-23 17:26:36

标签: c# methods static

这是一个非常新手的问题,但因为我花了一个下午尝试并且没有任何想法,我想我会在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
    }
}
}

乍一看,解决方案很简单:

  • 将方法'contract_details'公开,以便它可以访问'MyOptionsChainInput'方法,或
  • 在'contract_details'中创建一个新的Tester实例,然后访问MyOptionsChainInput。

但是,由于提供此选项数据的API接口的限制,两个选项都不可能。我怎么解决这个问题?也许我甚至需要丢弃班级测试员并找到另一种方式?

2 个答案:

答案 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); 
     }