Я обновляю приложение Windows Form, которое конвертирует разные валюты друг в друга (например, фунты в евро и наоборот). У меня была одна идея - создать класс, который использует инфраструктуру Web API для:
- скачать последние курсы обмена при запуске программы
- создать переменные, которые по отдельности содержат эти показатели
- хранит эти переменные конфиденциально в классе и ссылается на соответствующие переменные в каждой форме
(К сожалению, назначение ТРЕБУЕТ многоуровневого макета - иначе я бы использовал раскрывающиеся меню в одной форме.)
Это код, который я использовал до сих пор - в консольном приложении для целей планирования и тестирования:
static void Main(string[] args)
{
string URL = "https://openexchangerates.org/api/latest.json?app_id=4837847d2bc64fc496cf325525c5cf0d";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
request.ContentType = "application/json; charset=utf-8";
request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes("GBP"));
request.PreAuthenticate = true;
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
using (Stream responseStream = response.GetResponseStream())
{
StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
string streamString = reader.ReadToEnd();
string[] streamArray = Regex.Split(streamString, "\n|: |,\\s*");
foreach (string s in streamArray)
{
if (s.Equals("\"GBP\""))
{
int element = Array.IndexOf(streamArray,s);
string dTPString = streamArray[element + 1];
double dollarsToPounds = Convert.ToDouble(dTPString);
}
if (s.Equals("\"EUR\""))
{
int element = Array.IndexOf(streamArray, s);
string dTEString = streamArray[element + 1];
double dollarsToEuros = Convert.ToDouble(dTEString);
}
}
}
Console.WriteLine(dollarsToPounds); //does not work
Console.WriteLine(dollarsToEuros); //does not work
}
После проверки назначений массива и обеих двойных переменных "dollarToPounds" и "dollarToEuros" было доказано, что они имеют правильные значения в контексте оператора using (Stream ...) - однако , из-за свойств «using», этим переменным не были присвоены значения вне контекста (объявление переменных в начале Main () не влияет на этот результат).
Существует ли структура метода, которую я мог бы использовать вместо этого, которая выполняла бы ту же задачу, что и "using (Stream ...)", то есть для чтения содержимого предоставленного URL, который затем позволял бы ссылаться на переменные в других местах внутри тот же класс? Это позволило бы мне ссылаться на него за пределами класса.
Если вам нужно, чтобы я объяснил код дальше, непременно спросите.