На основании предоставленной вами ссылки на MegaApiClient
вы неправильно настраиваете AccountInfo
. Я могу ошибаться; этот ответ основан только на том, что вы предоставили, и на ссылке на источник MegaApiClient
, который, как я предполагаю, должен совпадать.
Я бы сначала написал свой AccountInfo
, чтобы он соответствовал интерфейсу IAccountInformation
следующим образом:
public struct AccountInfo : IAccountInformation
{
public long TotalQuota { get; set; }
public long UsedQuota { get; set; }
public IEnumerable<IStorageMetrics> Metrics { get; set; }
}
Я полагаю, что только изменение этого исправит вашу ошибку. В вашем коде вы указываете, что Metrics
- это long
, тогда как на самом деле это должно быть IEnumerable<IStorageMetrics>
. Если вам нужны дальнейшие объяснения, дайте мне знать, и я с удовольствием выложу / объясню подробнее.
Поскольку вы спрашивали о прозрении о Interface
, я постараюсь объяснить это кратко и кратко.
Interface
- это в основном синяя печать того, как должен выглядеть object
. Это объясняет особенности object
. Например: в интерфейсе IAccountInformation
(по предоставленной вами ссылке) указывается, что объект будет иметь как минимум свойство только для чтения long TotalQouta
. В нем также говорится, что есть два других свойства long UserQouta
и IEnumerable<IStorageMetrics> Metrics
.
Так что если вы делаете object
, который использует Interface
, вы должны реализовать эти функции, чтобы соответствовать Interface
. Вы увидите, что я добавил Interface
к struct
для вас и реализовал его точно. (Я также добавил сеттеры в свойства, так как вы используете их таким образом.)
Что-то интересное, что можно отнять, это использование полиморфизма. Теперь вы можете получить доступ к вашему объекту через прямой тип или через интерфейс IAccountInformation
как тип. Это полезно для методов, которые знают только о Interface
, а не Type
(или `` `объект````), который вы собираетесь написать самостоятельно.
Еще одна интересная вещь, которую стоит убрать, это то, как полиморфизм используется в IAccountInformation
Interface
уже. property
IEnumerable<IStoreMetrics> Metrics { get; }
утверждает, что любой Type
, производный от IAccountInformation
, также будет иметь перечисление типов, производных от IStorageMetrics
.
Когда мы посмотрим на IStorageMetrics
(по указанной вами ссылке), вы увидите 4 свойства (NodeId, BytesUsed, FilesCount, FoldersCount).
Код Interface
подобен портам на задней панели ресивера, телевизора или компьютера. У вас есть HDMI, RCA, Optic, USB и т. Д. ... Если у вас есть ресивер с RCA-выходом и Optic, то вы знаете, что можете подключить к нему кабели RCA или оптоволоконный, потому что это интерфейс для получатель. Разъемы RCA предназначены для выполнения каких-то определенных задач, но приемник не знает, что вы собираетесь к нему подключить. Он просто знает, что должен соответствовать этому интерфейсу. Код работает точно так же ... Мы не знаем, кто использует IAccountInformation
Interface
, но мы знаем, что у него будет настройка, о которой говорит IAccountInformation
, и мы можем общаться с ним через них.
Хорошо, вы обновили вопрос, и это нормально. Я оставлю то, что я написал, и выложу больше здесь.
Не забывайте, что Metrics
- это IEnumerable<IStorageMetrics>
, что означает, что это перечисление IStorageMetrics
типов. (Если это помогает визуализировать это, думайте о Metrics
как о массиве или списке IStorageMetrics
. IEnumerable
просто означает, что тип может быть перечислен.
Перечисления используются по-разному, но один из самых распространенных - это цикл, такой как цикл foreach
. Например, вы можете получить информацию из Metrics
следующим образом.
foreach (var storageMetric in myAccountInformation.Metrics)
{
var bytesUsed = storageMetric.BytesUsed;
var filesCount = storageMetric.FilesCount;
var foldersCount = storageMetric.FoldersCount;
var nodeId = storageMetric.NodeId;
// do what you want with the info here
}
Другое популярное использование IEnumerable
- это использование System.Linq
, которое использует IEnumerable
в основе всех запросов.
Вы можете использовать linq, как раньше, например ...
// The following will result in totalBytes being the sum of all Metrics
var totalBytes = myAccountInformation.Metrics.Sum(storageMetric => storageMetric.BytesUsed);
Таким образом, вы могли бы написать текст с чем-то вроде этого: (если вы хотите, чтобы значения были суммой BytesUsed, конечно.)
var totalBytesUsed = myAccountInformation.Metrics.Sum(storageMetric => storageMetric.BytesUsed);
textBox1.Text = FormatBytes(myAccountInformation.TotalQuota) + "\r\n" + FormatBytes(myAccountInformation.UsedQuota) + "\r\n" + totalBytesUsed;
Имеет ли это какой-то смысл?