TypeConverterクラス

コンストラクタ

特定の型のTypeConverterのインスタンスは、TypeDescriptor.GetConverter()で得られます。

public static System.ComponentModel.TypeConverter GetConverter (Type type);
GetConverter(Type) - TypeDescriptor.GetConverter Method (System.ComponentModel) | Microsoft Learn

メソッド

ConvertFrom()

指定のオブジェクトを、TypeConverterの型へ変換できます。

public object ConvertFrom (object value);
ConvertFrom(Object) - TypeConverter.ConvertFrom Method (System.ComponentModel) | Microsoft Learn

変換に失敗したときには「入力文字列の形式が正しくありません。(Input string was not in a correct format.)」としてFormatExceptionが投げられます。ただし.NET Frameworkのバージョンによっては、「valuetype の有効な値ではありません。(value is not a valid value for type.)」としてExceptionが投げられ、そのInnerException.HResultは0x80131537 (COR_E_FORMAT) です。

変換に対応していないときは「TypeConverter を System.String から変換できません。」のようなメッセージと共に、NotSupportedExceptionが投げられます。

オブジェクトがカルチャに依存するならば、それを指定します。

public virtual object ConvertFrom (
    System.ComponentModel.ITypeDescriptorContext context, // 書式コンテキスト
    System.Globalization.CultureInfo culture,             // カルチャ
    object value
    );

ConvertFromString()

指定の文字列を、TypeConverterの型へ変換できます。

public object ConvertFromString (string text);
ConvertFromString(String) - TypeConverter.ConvertFromString Method (System.ComponentModel) | Microsoft Learn
string text = "TRUE";

TypeConverter tc1 = TypeDescriptor.GetConverter(typeof(bool));
object o1 = tc1.ConvertFromString(text); // true

TypeConverter tc2 = TypeDescriptor.GetConverter(typeof(string));
object o2 = tc2.ConvertFromString(text); // "TRUE"

TypeConverter tc3 = TypeDescriptor.GetConverter(typeof(int));
object o3 = tc3.ConvertFromString(text); // FormatException「入力文字列の形式が正しくありません。」

内部的にはConvertFrom(null, null, text)と呼び出すことに等しいです。ConvertFromString - TypeConverter.cs

文字列がカルチャに依存するならば、それを指定します。

string text = "01/02/2000 00:00";
TypeConverter tc = TypeDescriptor.GetConverter(typeof(DateTime));

object o1 = tc.ConvertFromString(text);                                 // {2000/01/02 0:00:00}
object o2 = tc.ConvertFromString(null, CultureInfo.CreateSpecificCulture("en-GB"), text); // {2000/02/01 0:00:00}

ConvertFromInvariantString()

指定の文字列を、インバリアント カルチャを使用してTypeConverterの型へ変換できます。

内部的にはConvertFromString(null, CultureInfo.InvariantCulture, text)と呼び出すことに等しいです。ConvertFromInvariantString - TypeConverter.cs

ConvertTo()

指定のオブジェクトを、指定の型へ変換できます。

public virtual object ConvertTo (
    System.ComponentModel.ITypeDescriptorContext context,
    System.Globalization.CultureInfo culture,
    object value,
    Type destinationType
    );
ConvertTo(ITypeDescriptorContext, CultureInfo, Object, Type) - TypeConverter.ConvertTo メソッド (System.ComponentModel) | Microsoft Learn

ConvertTo(Object, Type)のオーバーロードでは、contextcultureにnullが渡されます。ConvertTo - TypeConverter.cs

string text = "TRUE";

TypeConverter tc1 = TypeDescriptor.GetConverter(typeof(bool));
object o1 = tc1.ConvertFromString(text); // true

object o2 = tc1.ConvertTo(o1, typeof(string)); // "True"

IsValid()

指定のオブジェクトがこのTypeConverterの型に対して、有効かどうか確認できます。

public bool IsValid (object value);
IsValid(Object) - TypeConverter.IsValid Method (System.ComponentModel) | Microsoft Learn

.NET Framework 4以降、このメソッドはCanConvertFrom()とConvertFrom()からの例外を捕捉します。

内部的にはCanConvertFrom()で変換の可否を確認後、ConvertFrom()で変換を試行し、例外が投げられなければtrueが返されます。よって実際に変換する必要があるならば、直接ConvertFrom()を呼び出して例外を捕捉した方が効率的です。IsValid - TypeConverter.cs

CanConvertFrom()

指定の型から、このTypeConverterの型へ変換可能か確認できます。

public bool CanConvertFrom (Type sourceType);
CanConvertFrom(Type) - TypeConverter.CanConvertFrom Method (System.ComponentModel) | Microsoft Learn

独自の型からの変換

変換方法を定義する、TypeConverterを継承したクラスを作成します。typeconverter - c# how to implement type converter - Stack Overflow

public class MyTypeConverter : TypeConverter
{
    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        string casted = value as string;
        return casted != null
            ? new MyClass(int.Parse(casted))
            : base.ConvertFrom(context, culture, value);
    }

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        MyClass casted = value as MyClass;
        return casted != null
            ? casted.ToString()
            : base.ConvertTo(context, culture, value, destinationType);
    }

    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        return sourceType == typeof(MyClass) || base.CanConvertFrom(context, sourceType);
    }
}

そして、それを対象の型にTypeConverterAttribute属性の型として設定します。

[TypeConverter(typeof(MyTypeConverter))]
class MyClass
{
    private int value;

    public MyClass(int value)
    {
        this.value = value;
    }
}

こうすることで、想定している型に対して変換できるようになります。

TypeConverter tc = TypeDescriptor.GetConverter(typeof(MyClass));
object o1 = tc.ConvertFrom(null, null, "10"); // ok
object o2 = tc.ConvertFromString("10");       // ok

object o3 = tc.ConvertFrom(null, null, 10); // NotSupportedException
Microsoft Learnから検索