1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/blqw-blqw.Convert3

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
OLD_README.MD 6.9 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 11:35 e958109

blqw.Convert3: универсальный конвертер

Преобразование объектов стало ещё проще!

obj.To<T>();                //преобразование завершается неудачно, выбрасывается исключение
obj.To<T>(T defaultValue);  //преобразование завершается неудачно, возвращается значение по умолчанию
obj.To<T>(out succeed);     //выводит информацию об успешности преобразования
//ниже представлены три не обобщённых метода
obj.To(Type outputType);
obj.To(Type outputType, object defaultValue);
obj.To(Type outputType, out succeed);

Демонстрация кода

Дополнительные примеры кода: демо, юнит-тест 1.

//основное
"1".To<int>();
"a".To<int>(0); //преобразование завершается неудачно и возвращает 0
"是".To<bool>(); //поддерживает "是/否", "真/假", "对/错", "t/f", "true/false" и т. д.
byte[].To<Guid>();

//продвинутое
"1,2,3,4,5,6".To<int[]>();
"{\"id\":\"name\":\"blqw\"}".To<User>();
Dictionary.To<Entity>(); //преобразует пары ключ-значение в объект
DataRow.To<Entity>(); //преобразует строку данных в объект
DataTable.To<List<Entity>>; //преобразует таблицу данных в список объектов

//более сложное
DataTable.To<List<NameValueCollection>>();
List<Dictionary<string, object>>.To<DataTable>();
new { ID=1, Name="blqw"}.To<User>(); //анонимный класс преобразуется в объект User

//извращённое вложение
Dictionary<Guid, Dictionary<int, User>>
    .To<Dictionary<string, Dictionary<DateTime, NameValueCollection>>>(); //невозможно понять, так что пусть будет

Расширение пользовательских конвертеров

Расширение поведения преобразования основано на целевом типе.
Например, для преобразования в пользовательский тип MyClass необходимо реализовать интерфейс IConvertor<MyClass> или напрямую унаследовать базовый класс BaseConvertor<MyClass>, сохранив конструктор без параметров.
IOC-компонент автоматически загрузит все типы, реализующие IConvertor.

1. Определение класса MyClass:

class MyClass
{
    public int Number { get; set; }
}

2. Код конвертера:

class MyClassConvertor : BaseConvertor<MyClass>
{
    protected override MyClass ChangeType(ConvertContext context, object input, Type outputType, out bool success)
    {
        var i = context.Get<int>().ChangeType(context, input, typeof(int), out success);
        return success ? new MyClass() { Number = i } : null;
    }

    protected override MyClass ChangeType(ConvertContext context, string input, Type outputType, out bool success)
    {
        var i = context.Get<int>().ChangeType(context, input, typeof(int), out success);
        return success ? new MyClass() { Number = i } : null;
    }
}

3. Тестовый код:

var x = "1234".To<MyClass>(null);
Console.WriteLine(x?.Number); //1234
x = "abcd".To<MyClass>(null);
Console.WriteLine(x?.Number); //null

Другие функции

//преобразование чисел в верхний регистр
//параметры: 1 — число, которое нужно преобразовать, 2 — использовать ли упрощённый китайский, 3 — добавлять ли круглые углы (только две цифры сохраняются), 4 — поддерживать ли числа больше 15 цифр
Console.WriteLine(Convert3.NumberToUpper("123456456.789", true, true, false)); //один миллиард двести тридцать четыре миллиона пятьсот шестьдесят четыре тысячи пятьсот шестьдесят шесть юаней семь углов восемь долей

//преобразование китайских иероглифов в пиньинь
Console.WriteLine(Convert3.ToPinyin("冰麟轻武", PinyinMode.AllFirst));      //BLQW
Console.WriteLine(Convert3.ToPinyin("冰麟轻武", PinyinMode.First));         //B
Console.WriteLine(Convert3.ToPinyin("冰麟轻武", PinyinMode.Full));          //BingLinQingWu
Console.WriteLine(Convert3.ToPinyin("冰麟轻武", PinyinMode.FullWithSplit)); //Bing Lin Qing Wu

//полное и полуширинное преобразование
Console.WriteLine(Convert3.ToDBC(",1234567aks"));//,1234567aks
Console.WriteLine(Convert3.ToSBC("!1f23d.?@"));         //!1f23d.?@

//резюме/шифрование
Console.WriteLine(Convert3.ToMD5("123456"));    //e10adc3949ba59abbe56e057f20f883e
Console.WriteLine(Convert3.ToSHA1("123456"));   //7c4a8d09ca3762af61e59520943dc26494f8941b

//преобразовать в динамический тип
var a = new Dictionary<string, object>() { ["id"] = 1, ["name"] = "blqw" };
Console.WriteLine(Convert3.ToDynamic(a).name);   //blqw
Console.WriteLine(Convert3.ToDynamic(a).id == 1);//True

//случайное шифрование
var arr = new[]
{
    Convert3.ToRandomMD5("123456"),
    Convert3.ToRandomMD5("123456"),
    Convert3.ToRandomMD5("123456"),
    Convert3.ToRandomMD5("12306"),
    Convert3.ToRandomMD5("123456"),
};

foreach (var g in arr)
{
    Console.WriteLine($"{g} : {Convert3.EqualsRandomMD5("123456", g)}");
}
/*
fa91eefc-e903-dbcf-394b-0b757987357b : True
27abd3e0-fe0e-2eeb-1ff7-a60b03876465 : True
6d911bf2-0c59-0e01-5e87-7527dd1ee699 : True
0af7905a-0b3b-4eb4-b82b-0340f3438924 : False
1e024253-6bb9-fb25-4b67-3e42c265af02 : True
*/

Обновление:

[3.0.5] 2016.11.30

  • Оптимизация процесса преобразования одиночного значения в массив, например: string s = "abc"; s.To<string[]>(); теперь будет возвращать массив new string[]{"abc"}.
  • Улучшена обработка ошибок для интерфейсов, абстрактных классов, статических классов и классов с определениями универсальных типов.

Юнит-тесты

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/blqw-blqw.Convert3.git
git@api.gitlife.ru:oschina-mirror/blqw-blqw.Convert3.git
oschina-mirror
blqw-blqw.Convert3
blqw-blqw.Convert3
master