Главная » C#, Компоненты » Конвертеры типов .NET Framework 2.0

0

Библиотека .NET Framework содержит множество конвертеров. Я приведу лишь несколько из них:

?  System. ComponentModel.BaseNumberConverter—базовый класс ДЛЯ преобразования числовых значений. От него наследованы многие конвертеры, такие как ByteConverter, DecimalConverter, Intl6Converter И Др.;

?  System.ComponentModel .BooleanConverter — конвертер ДЛЯ типа bool;

?  System.ComponentModel. charconverter — конвертер для Unicode-символов;

?  System.ComponentModel.CollectionConverter— конвертер ДЛЯ коллекций;

?  System.ComponentModel.DateTimeConverter— конвертер для даты И времени;

?  System. ComponentModel.EnumConverter—конвертер для перечислений;

?  System. ComponentModel. StringConverter — конвертер ДЛЯ типа строк;

?  System.Drawing. FontConverter— конвертер ДЛЯ шрифтов;

?  System. Drawing. ColorConverter — конвертер ДЛЯ типа Color;

?  System. Drawing. PointConverter — конвертер ДЛЯ типа Point;

0     System. Drawing. RectangleConverter — конвертер ДЛЯ типа Rectangle;

?  System. Drawing. SizeConverter — конвертер ДЛЯ типа Size.

Небольшой пример показывает работу конвертера Booieanconverter (листинг 8.3). При подключении такого конвертера к свойству типа bool вместо обычных значений true и false будут показываться значения да и нет (рнс. 8.2). Вообще говоря, ничто не мешает нам использовать конвертеры и врежиме выполнения (листинг 8.4).

‘Листинг 8 3 Использование BcoleanCuitvert.br

using System;

using System.Collections .Generic; using System.Text; using System.ComponentModel; using System.Globalization;

namespace MyControl

1          

public class BoolTestControl : Component

{

private bool test;

// Тестовое свойство с подключенным конвертером [TypeConverter(typeof(BooleanTypeConverter))]

public bool Test {

get ( return test; } set ( test = value; }

}

}

// Конвертер

class BooleanTypeConverter : BooleanConverter

{

const string Yes = "Да"; const string No = "Нет";

// Преобразуем bool в Да/Нет

public override object ConvertTo(ITypeDescriptorContext context,

Culturelnfo culture, object value, Type destType)

{

return (bool)value ? Yes : No;

}

// Преобразуем Да/Нет в bool

public override object ConvertFrom(ITypeDescriptorContext context,

Culturelnfo culture, object value)

{

return (string)value = Yes;

}

}

}

Листинг 8 4 Испольчоиание u-soli ar.coi *urrt t n режиме выполнения

using System;

using System. Collections.Generic;

using System. Text;

us ing Sys tem.ComponentModel;

namespace ConverterTest I

class Program

{

static void Main(string[] args) {

// Создаем конвертер

BooleanConverter be = new BooleanConverter();

// Конвертируем строку в bool

bool t = (bool)be.ConvertFromString("true");

Console.WriteLine(t) ;

// Конвертируем bool в строку

string s = (string)be.ConvertTo(false, typeof(string)); Console.WriteLine(s) ;

}

}

}

Рис. 8.2. Работа BooleanConverter

Еще одна часто возникающая задача— отображение описаний значений перечисления вместо стандартных значений. Для решения этой задачи используется конвертер Enumconverter. Хранить сами описания можно либо в коде (что не очень красиво), либо в ресурсах, либо в метаинформации. Последний вариант представляется мне наиболее наглядным. Чтобы не изобретать собственный атрибут, воспользуемся уже существующим атрибутом Description. Теперь в методе ConvertTo О нужно получить значение этого атрибута, а в методе convertFromO — найти элемент перечисления, имеющий такой атрибут. Реализация этого алгоритма показана в листинге 8.5, а результат работы— на рис. 8.3.

ВМетииг 8.5. Использование UriukZuri/wL u. i

using System;

using System.Collections .Generic;

using System.Text;

using System.ComponentModel;

using System.Globalization; using System.Reflection;

namespace MyControl {

// Перечисление с атрибутами описаний

public enum Operation

{

[Description("He выбрано"}] None = 0,

[DescriptionC’CnojKeHne") ] Add,

[Description("Вычитание")] Sub,

[Description("Умножение")] Mul,

[Description("Деление"}] Dev

}

// Тестовый компонент со свойством типа Enum

public class EnumTestComponent : Component

{

private Operation operation;

[TypeConverter(typeof(EnumTypeConverter))]

public Operation Operation

{

get { return operation; } set { operation = value; }

}

}

// Конвертер значений в описания и обратно

class EnumTypeConverter : EnumConverter {

private Type enumType;

// Конструктор запоминает тип перечисления

public EnumTypeConverter(Type enumType) : base(enumType)

{

this.enumType – enumType;

11 Разрешаем преобразование перечисления в строку public override bool CanConvertTo{

ITypeDescriptorContext context, Type destType)

{

return destType == typeof(string);

}

// Конвертируем перечисление в строку public override object ConvertTo(

ITypeDescriptorContext context,

Culturelnfo culture,

object value, Type destType)

{

// Получаем значение атрибута Description // для значения перечисления Fieldlnfo fi =

enumType.GetField(Enum.GetName(enumType, value}); DescriptionAttribute da =

(DescriptionAttribute)Attribute.GetCustomAttribute ( fi, typeof(DescriptionAttribute));

// Если атрибут не задан, возвращаем значение как есть if (da != null)

return da.Description; else

return value.ToString(};

}

// Разрешаем конвертировать перечисление из строки public override bool CanConvertFrom(

ITypeDescriptorContext context, Type srcType)

1

return srcType = typeof(string);

}

// Конвертируем строку в значение перечисления public override obj ect Convert From(

ITypeDescriptorContext context, Culturelnfo culture, object value)

{

// Надо найти тот элемент перечисления,

// у которого атрибут Description равен искомому значению

foreach (Fieldlnfo fi in enumType.GetFields())

{

DescriptionAttribute da = (DescriptionAttribute) Attribute.GetCustomAttribute{

fi, typeof(DescriptionAttribute));

if ((da != null) && ((string)value == da.Description)) return Enum.Parse(enumType, fi.Name);

}

// Если не нашли значение в атрибутах, // пытаемся преобразовать строку в перечисление return Enum.Parse(enumType, (string)value);

}

)

}

Рис. 8.3. Работа EnumConverter

Литература:

Агуров П. В. C#. Разработка компонентов в MS Visual Studio 2005/2008. – СПб.: БХВ-Петербург, 2008. — 480 е.: ил.

По теме:

  • Комментарии