Метод расширения не компилируется (нет определения для типа 'строка') - PullRequest
2 голосов
/ 11 января 2011

Я пытаюсь преобразовать байты в КБ / МБ / ГБ, используя приведенный ниже код, однако, похоже, что он не работает.Значение квоты составляет 60000000000.

    public static double BytesToKilobytes(this Int32 bytes)
    {
        return bytes / 1000d;
    }

    public static double BytesToMegabytes(this Int32 bytes)
    {
        return bytes / 1000d / 1000d;
    }

    public static double BytesToGigabytes(this Int32 bytes)
    {
        return bytes / 1000d / 1000d / 1000d;
    }

    void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Error != null)
            return;

        XDocument xDocument = XDocument.Parse(e.Result);

        listBox1.ItemsSource = from query in xDocument.Descendants("service")
                               select new Service
                               {
                                   type = query.Attribute("type").Value,
                                   id = query.Element("id").Value,
                                   plan = query.Element("username").Value,
                                   quota = query.Element("quota").Value.BytesToGigabytes,                                   };
    }

Ошибка, которую выдает приведенный выше код:

"'string" не содержит определения для "BytesToGigabytes" и не имеет метода расширения "BytesToGigabytes'можно найти первый аргумент типа' строка '(вы пропустили директиву using или ссылку на сборку?) "

Ответы [ 4 ]

5 голосов
/ 11 января 2011

Поскольку квота является строкой, сначала необходимо разобрать ее в число:

quota = Decimal.Parse(query.Element("quota").Value).BytesToGigabytes()

Поскольку число слишком велико, чтобы поместиться в 32-разрядное целое число, необходимо использовать десятичное число:

public static Decimal BytesToGigabytes(this Decimal bytes) {
  return bytes / 1000m / 1000m / 1000m;
}

Можно также использовать Int64, но тогда метод будет усекать результат, возвращая, например, 3 ГБ вместо 3,9 ГБ.

2 голосов
/ 11 января 2011

Это потому, что Value является строкой, а методы расширения объявлены для Int32.Вам нужно будет преобразовать Value в Int32 до вызова метода расширения.

Пример:

void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    Func<string, Int64> convertToInt64 = s =>
    {
       Int64 result;
            // replace 0 with whatever default you want
       return Int64.TryParse(s, out result) ? result : 0;
    };
    if (e.Error != null) return; 
    XDocument xDocument = XDocument.Parse(e.Result); 
    listBox1.ItemsSource = from query in xDocument.Descendants("service") 
                           select new Service 
                           { 
                               type = query.Attribute("type").Value, 
                               id = query.Element("id").Value, 
                               plan = query.Element("username").Value, 
                               quota = convertToInt64(query.Element("quota").Value)
                                           .BytesToKilobytes()
                           };
}

Это также означает, что методы расширения должны быть объявлены для Int64:

public static double BytesToKilobytes(this Int64 bytes) 
1 голос
/ 11 января 2011

Не зная, что в аргументах вашего события, ошибка довольно проста.

Не существует расширения для BytesToGigabytes для типа строки.

Таким образом, query.Element ("quota") возвращает строку. Если вы разберете его (int.Parse() или int.TryParse(), то вам повезет больше.

0 голосов
/ 11 января 2011

Пара ошибок, хотя ... вместо этого следует разделить на 1024 ... и преобразовать значение в Int .. см. Ниже.

 public static double BytesToKilobytes(this Int32 bytes)
    {
        return bytes / 1024d;
    }

    public static double BytesToMegabytes(this Int32 bytes)
    {
        return bytes / 1024d / 1024d;
    }

    public static double BytesToGigabytes(this Int32 bytes)
    {
        return bytes / 1024d / 1024d / 1024d;
    }

    void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Error != null)
            return;

        XDocument xDocument = XDocument.Parse(e.Result);

        listBox1.ItemsSource = from query in xDocument.Descendants("service")
                               select new Service
                               {
                                   type = query.Attribute("type").Value,
                                   id = query.Element("id").Value,
                                   plan = query.Element("username").Value,
                                   quota = Convert.ToInt32(query.Element("quota").Value).BytesToGigabytes(),                                   };
    }

Надеюсь, это поможет

...