Это довольно интересный вопрос для новичка, но, поскольку я провел целый день, пытаясь, и у меня не осталось идей, я решил разместить его здесь, в 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', или
- Создайте новый экземпляр Tester в 'contract_details' и затем получите доступ к MyOptionsChainInput.
Однако из-за ограничений интерфейса API, который предоставляет данные этой опции, обе опции невозможны. Как я могу решить это? Возможно, мне даже нужно отказаться от класса Tester и найти другой способ?