Programming/.NET

컨트롤을 제작할때 설정에 관한 내용은 대부분 속성을 통해 정의됩니다. 속성은 특별한 과정을 거치지 않아도 속성타입에 대해 적절한 형변환이 이루어져 컨트롤을 디자인할때 속성창에 노출되고 개발자가 원하는 특정값을 속성창을 통해 설정할 수 있습니다.

 

하지만 형변환을 명시적으로 해주어야 하는 경우에 형변환은 TypeConverter 클래스를 사용합니다. 이 클래스는 속성값을 속성창에 보여줄때 string형으로 변환했다가 속성값이 입력되면 다시 해당 속성형식으로 변환해 값을 받아들일 수 있도록 합니다.

 

[Bindable(true)]
[Category("Appearance")]
[TypeConverter(typeof(ColorConverter))]
public Color FrontColor
{
    get;
    set;
}

 

위 예제는 색상을 설정할 수 있는 FrontColor라는 속성을 정의해 두고 TypeConverter특성을 통해 속성의 변환형태를 Color(ColorConverter)로 지정하였습니다. Converter(타입변환기)는 Color이외에 Int나 GUID등 다양한 형태로 존재하므로 원하는 타입변환기를 설정할 수 있습니다.

 

만약 정의한 속성이 커스텀화된 경우라면 단순한 타입변환기로는 구현이 불가능하므로 직접 형변환에 대한 로직을 구현해야 합니다.

 

public class FrontColor
{
    public FrontColor(Color color)
    {
        SetColor = color;
    }

    public Color SetColor
    {
        get;
        set;
    }
}

 

여기 FrontColor라는 클래스가 있습니다. 이 클래스에 맞는 형변환을 구현하려면 TypeConverter클래스로 부터 상속받은 새로운 클래스를 형변환클래스로 작성합니다.

 

public class FrontColorConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        if (sourceType == typeof(string))
            return true;

        return base.CanConvertFrom(context, sourceType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        if (value is string) {
            Color color = Color.FromName((string)value);
            return new FrontColor(color);
        }

        return base.ConvertFrom(context, culture, value);
    }

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(Color)) {
            return ((FrontColor)value).SetColor.Name;
        }

        return base.ConvertTo(context, culture, value, destinationType);
    }
}

 

위에서 작성된 CanConvertFrom메소드는 전달된 값이 실제 지정된 형으로 변환이 가능한지를 확인하는 용도이며 ConvertFrom은 string을 FrontColor타입으로 변환하고 ConvertTo는 FrontColor타입을 다시 string형으로 변환하는 역활을 수행함으로서 컨트롤의 속성값을 디자인타임에서 출력하거나 입력을 받아 적절히 처리할 수 있도록 합니다.

'Programming > .NET' 카테고리의 다른 글

[ASP.NET] 설정파일 - 2  (0) 2017.03.06
[ASP.NET] 서버 컨트롤 - 8 (디자인)  (0) 2017.03.03
[ASP.NET] 서버 컨트롤 - 7 (형변환)  (0) 2017.02.22
[ASP.NET] 서버 컨트롤 - 6 (컨트롤)  (0) 2017.02.08
[ASP.NET] HttpModule, HttpHandler  (0) 2017.02.02
[ASP.NET] AJAX  (0) 2017.01.24
0 0