C #, как я могу использовать WebAPI для создания переменных внутри класса, на которые затем можно ссылаться в другом классе? - PullRequest
0 голосов
/ 01 мая 2018

Я обновляю приложение 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, который затем позволял бы ссылаться на переменные в других местах внутри тот же класс? Это позволило бы мне ссылаться на него за пределами класса.

Если вам нужно, чтобы я объяснил код дальше, непременно спросите.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Благодаря совету Тони , я реализовал решение поставленного выше вопроса! Ключ заключается в том, чтобы объявить переменные dollarToPounds и dollarToEuros ДО того, как вы введете метод, в котором реализованы WebAPI и StreamReader, и перед тем, как сделать это, вызвать экземпляр класса в начале метода:

 class Program
{
    double dollarsToPounds;
    double dollarsToEuros;

    static void Main(string[] args)
    {
        Program program = new Program();

        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];

                    program.dollarsToPounds = Convert.ToDouble(dTPString);
                }

                if (s.Equals("\"EUR\""))
                {
                    int element = Array.IndexOf(streamArray, s);
                    string dTEString = streamArray[element + 1];
                    program.dollarsToEuros = Convert.ToDouble(dTEString);
                }
            }
        }
        Console.WriteLine(program.dollarsToPounds); //works!
        Console.WriteLine(program.dollarsToEuros); //works!
    }
}

Структура, упрощенная:

class ClassName
{
    //variables go here

    static void MethodName()
    {
        ClassName instance = new ClassName();
            //Web API, using StreamReader, arrays, nested foreach-if statements go here
        //variables can now be referenced outside of "using" context
    }
}

Спасибо еще раз! Мой лектор, вероятно, будет чувствовать себя немного глупо, когда я покажу ему это завтра.

0 голосов
/ 01 мая 2018

Вы можете переместить декларации

double dollarsToPounds 

и

double dollarsToEuros 

до строки

static void Main(string[] args) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...