locked
Небольшой хак для локализованного вывода размера файлов в килобайтах, мегабайтах и т.д. RRS feed

  • Общие обсуждения

  • Сделал небольшой хак для вывода локализованных размеров файлов (или других данных). Работает просто: закидываем в него количество байтов типа int, а на выходе получаем строку, например, "34,5 Кб"

    Решение работает если установлен пакет wptoolkit, так что если не используете в проекте windows phone toolkit, то это решение вам не подойдет.

    Подключаем сборки:

    using Microsoft.Phone.Controls;
    using System.Reflection;

    далее в создаем метод:

    string GetStringSize(int size)
    {
                    MethodInfo method = typeof(TransferMonitor).GetMethod("BytesToString", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static);
                    string str = method.Invoke(null, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { size }, null).ToString();
                    return str;
    }
     

    С помощью рефлексии ищем метод BytesToString класса TransferMonitor (сигнатура метода и сам класс в исходниках Windows phone  toolkit) и выполняем его вызовом method.Invoke.

    size передаем как элемент массива new object[] { size }.

    Результат на картике:

    Прошу заметить что это решение не только снимает необходимость "ручного" приведения размеров из байт в килобайты и мегабайты, но еще и является локализованным "по умолчанию" под кучу языков. Список языков можно опять же посмотреть в исходниках.

    Вопрос один: как быстро работает рефлексия на windows phone?

    Спасибо.

    PS. Reflection использовал так как метод BytesToString помечен как protected static

              

    • Изменено V.A.Zolotov 9 января 2014 г. 20:27
    9 января 2014 г. 20:16

Все ответы

  • Добрый день.

    А приведенный фрагмент кода это единственное место, где вы используете Reflection? Если да, то можно обойтись и без этой технологии...

    10 января 2014 г. 9:06
    Отвечающий
  • Да, единственное. Подскажите, какие варианты еще есть?

     Спасибо.

    10 января 2014 г. 9:24
  • Ну как же, просто вызвать этот статический метод BytesToString у класса TransferMonitor...

    Как то так:

    string result = TransferMonitor.BytesToString(...);
    10 января 2014 г. 9:52
    Отвечающий
  • Ну как же, просто вызвать этот статический метод BytesToString у класса TransferMonitor...

    Как то так:

    string result = TransferMonitor.BytesToString(...);
    Я бы так и сделал если бы этот метод не был бы еще и protected, а значит доступен только в классах наследниках.
    10 января 2014 г. 9:58
  • Ну так и добавьте в проект класс наследник и пользуйтесь им... В чем проблема то?

    10 января 2014 г. 13:08
    Отвечающий
  • Ну так и добавьте в проект класс наследник и пользуйтесь им... В чем проблема то?

    Наверное, в довольно редкой для меня заточенности на процесс, а не результат) Что-то я слишком глубоко копнул).
    10 января 2014 г. 15:35
  • Бывает ;)
    11 января 2014 г. 8:37
    Отвечающий