Проблемы с доступом к собственности

С помощью всех в очень короткие сроки. Проблема была решена путем переопределения метода toString.

У меня проблема со следующим: (решено)

public class CryptoApiResponse
{
    [DeserializeAs(Name = "ticker")]
    public List<CryptoAttributes> CryptoCurrency { get; set; }

    public override string ToString()
    {
        return $"Currency:{CryptoCurrency[0].Currency} " +
               $"PriceFiat:{CryptoCurrency[0].PriceFiat} " +
               $"Fiat:{CryptoCurrency[0].TargetFiat}";
    }
}

public class CryptoAttributes
{
    [DeserializeAs(Name = "base")]
    public string Currency { get; set; }

    [DeserializeAs(Name = "target")]
    public string TargetFiat { get; set; }

    [DeserializeAs(Name = "price")]
    public string PriceFiat { get; set; }
}

И я хочу получить доступ к следующему:

public void Display<CryptoApiResponse>(List<CryptoApiResponse> apiList)
{
    if (apiList != null)
    {
        foreach (CryptoApiResponse cryptoCurrency in apiList)
        {
            Console.WriteLine(cryptoCurrency.ToString());
        }
    }

    Console.ReadLine();
}

3 ответа

Решение
Console.WriteLine(obj);
// this means more or less the following
Console.WriteLine(obj.ToString());
// this means you should override the ToString() method
// or to make a custom string

Вы просматриваете список, и в каждой криптографии есть список подсписков. Короче вы получаете список>.

Когда вы просматриваете этот список, вам может понадобиться использовать второй foreach для итерации значений в подсписке, чтобы достичь вашего свойства.

foreach (var crypt in crypto)
{
  foreach (var basedata in crypt.Ticker)
  {
    Console.WriteLine($"Currency:{basedata.Currency} Price: {basedata.Price} Target: {basedata.Target}");
  }
}

Если вы сохраните названия API, с которыми вы связаны, и проведете различие между списками и именами отдельных объектов, вам будет легче понять, в чем проблема. Классы должны выглядеть примерно так (обратите внимание на разницу между Ticker а также Tickers

public class Crypto
{
    public List<Ticker> Tickers { get; set; }
}

public class Ticker
{
    public string Currency { get; set; }
    public string Target { get; set; }
    public string Price { get; set; }
}

Параметр crypto (должно быть cryptos) в Display это список и Tickers это список, поэтому вам нужен вложенный цикл. Вы также должны удалить Crypto Параметр из подписи метода, как он скрывает Crypto учебный класс

public void Display(List<Crypto> cryptos)
{
    foreach (Crypto crypto in cryptos)
    {
        foreach (Ticker ticker in crypto.Tickers)
        {
            Console.WriteLine(ticker);
        }
    }
}

Или, если вы хотите использовать частичный Linq

public void Display(List<Crypto> cryptos)
{
    foreach (Ticker ticker in cryptos.SelectMany(crypto => crypto.Tickers))
    {
        Console.WriteLine(ticker);
    }
}

Не могли бы вы попытаться использовать "Crypto" вместо "var" при зацикливании? Я имею в виду сделать это так. Я помню версию до VS2015 (может быть VS2010), тип переменной будет рассматриваться как объект, если мы используем "var".

public void Display<Crypto>(List<Crypto> crypto)
{
    if (crypto != null)
    {
        // Currency, Target and Price
        foreach (***Crypto*** ticker in crypto)
        {
            Console.WriteLine(ticker); // ticker Type Crypo
            // ticker.Ticker
        }
    }

    Console.ReadLine();
}
Другие вопросы по тегам