본문 바로가기

Develop/.NET 가이드

[C#] 리플렉션 Reflection (3) : PropertyDescriptor.SetValue에 TypeConverter 로 데이터 형변환하기

반응형

Reflection
Reflection

PropertyDescriptor.SetValue에 TypeConverter 활용하기

리플렉션 Reflection (2) : 타입에 따라 동적으로 객체 생성하기 글에서 TagFactory를 통해 Tag 클래스에 속성 값을 입력할 때, XML 파일의 string을 읽어 string으로 객체에 저장하기 때문에 형변환 문제가 발생하지는 않았습니다. 기본 데이터 타입으로 변환할 때는 문제가 발생하지 않았지만, 만약 개발자가 정의한 클래스로 저장해야 한다면 문제가 발생하게 됩니다. 이러한 데이터 변환 문제를 해결하는 방법을 알려드리도록 하겠습니다.

propertyDescriptor.SetValue(tag, propertyDescriptor.Converter.ConvertFromInvariantString(attributeValue));

위 예제 코드에 보면 propertyDescriptor.Converter.ConvertFromInvariantString(attributeValue) 함수를 사용하고 있는데, 함수의 원형은 TypeConverterTypeConverter.ConvertFromInvariantString 함수입니다. 그리고 propertyDescriptor.Converter 는 특성 (Attribute) 으로 지정된 클래스를 활용합니다. 따라서 아래와 같이 변환하고자 하는 데이터 클래스에 특성으로 TypeConverter 만 지정하면, 자동으로 지정된 Converter를 불러와 string을 원하는 클래스로 변환해줍니다.

1. TypeConverter를 상속한 클래스를 만듭니다.

    public class DataConverter : TypeConverter
    {
        // 이 함수만 override 해도 됩니다.
        public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
        {
            if(value == null || !(value is string))
            {
                throw new NotImplementedException();
            }
        }
    }

2. 특성으로 새로 만든 TypeConverter를 지정합니다.

[TypeConverter(typeof(DataConverter))]
public class Data
{

}
반응형