カスタムクラスに型コンバータを実装する方法

  カスタムクラスに型コンバータを実装するには、 ExpandableObjectConverter クラスの派生クラスとして生成します。
この派生クラスにメソッドをオーバーライドして、オブジェクトのオブジェクトのインスタンスを作成するために必要な情報を定義します。
【使い方】

 カスタムクラスのコンバータのサンプルです。
/// <summary>
///  TableInfo 型への変換や、その逆の変換を行う型コンバータを提供します。
/// </summary>
internal class TableInfoConverter : ExpandableObjectConverter 
{
    /// <summary>
    ///  コンバータがオブジェクトを指定した型に変換できるかどうかを示す値を返します。
    /// </summary>
    public override bool CanConvertTo( ITypeDescriptorContext context, Type destinationType ) 
    {
        // 文字型への変換を可能にします。
        if ( destinationType == typeof(string))
            return true;
        // インスタンス化を可能にします。
        if ( destinationType == typeof(InstanceDescriptor))
            return true;

        return base.CanConvertTo( context, destinationType );
    }
    /// <summary>
    ///  指定した値オブジェクトを、指定した型に変換します。
    /// </summary>
    public override object ConvertTo( ITypeDescriptorContext context, 
        System.Globalization.CultureInfo culture, object value, Type destinationType ) 
    {
        // 文字型に変換する場合
        if ( destinationType == typeof(string) && value is JoinView.TableInfo ) 
        {
            JoinView.TableInfo ti = (JoinView.TableInfo)value;
            return ti.TableName + "(" + ti.RelationName + ")";            
        }
        // インスタンス化する場合
        if ( destinationType == typeof(InstanceDescriptor) && value is JoinView.TableInfo ) 
        {
            JoinView.TableInfo ti = (JoinView.TableInfo)value;
            System.Reflection.ConstructorInfo cInfo = null;
        
            cInfo = typeof(JoinView.TableInfo).GetConstructor
                                    ( new Type[] { typeof(string), typeof(string), typeof(bool) });
        
            if (cInfo != null)
            {
                return new InstanceDescriptor
                                 (cInfo, new object[] { ti.TableName, ti.RelationName, ti.AutoCreate });
            }
        }
        return base.ConvertTo( context, culture, value, destinationType );
    }   
}
 

 カスタムクラスのコンバータをクラスに定義します。TypeConverter 属性とクラスのインスタンスを設定します。
/// <summary>
/// 連結するDataTable情報オブジェクトクラス
/// </summary>
[Serializable, TypeConverter(typeof(TableInfoConverter))]
public class TableInfo
{
    private  string      m_TableName     = null;        // 連結対象となるDataTable名
    private  string      m_RelationName  = null;        // 親子間のリレーションシップ名
    private  bool        m_AutoCreate    = false;       // レコード追加時に親に連動して自動生成するかを示す値
                                                        //     (true:生成する、false:生成しない)

    /// <summary>
    /// 連結するDataTable情報オブジェクトクラスの新しいインスタンスを初期化します。
    /// </summary>
    public TableInfo()
    {
    }

    /// <summary>
    /// 連結するDataTable情報オブジェクトクラスの新しいインスタンスを初期化します。
    /// </summary>
    /// <param name="tableName">連結対象となるDataTable名。</param>
    /// <param name="relationName">親子間のリレーションシップ名。</param>
    /// <param name="autoCreate">レコード追加時に親に連動して自動生成するかを示す値。</param>
    public TableInfo( string tableName, string relationName, bool autoCreate )
    {
        m_TableName = tableName;
        m_RelationName = relationName;
        m_AutoCreate = autoCreate;
    }

    //================================
    // プロパティ&メソッドを記述
    //================================
}
【注意】
【参考】
 さらに詳しい内容は .NET Framework 開発者ガイド 型コンバータの実装 を参照してください。
戻る