2007年9月27日木曜日

プロパティでSystem.Typeを指定したい?(5)

今回はConvertTo関係。これでTypeConverterな話は一段落。前々の記事に書いたように「TypeConverterで扱う型・クラスをある型・クラスに変換」な処理を行うのがこのメソッド。

使われる場面ってのはプロパティダイアログ・・・ではなく実行時だと思っていていいのかな?いきなりだけど実際のロジック。

''' <summary>コンバータが、指定したコンテキストを使用して、指定した型にオブジェクトを変換できるかどうかを示す値を返します</summary>
Public Overrides Function CanConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal destinationType As System.Type) As Boolean
    If destinationType Is GetType(System.Type) Then Return True
    Return MyBase.CanConvertTo(context, destinationType)
End Function

''' <summary>指定したコンテキストとカルチャ情報を使用して、指定した値オブジェクトを、指定した型に変換します</summary>
Public Overrides Function ConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object, ByVal destinationType As System.Type) As Object
    If TypeOf value Is System.Type Then
        For Each child As System.Type In Me.GetClassList(context)
            Dim targetType As System.Type = TryCast(value, System.Type)
            If (targetType IsNot Nothing) AndAlso (child.Name = targetType.Name) Then
                Dim result As String = String.Empty
                result = child.Name.Replace(child.Namespace, "")
                Return result
            End If
        Next
        Return String.Empty
    End If
    Return MyBase.ConvertTo(context, culture, value, destinationType)
End Function

プロパティに設定されるのはStringによるクラス名なので、それを実際のインスタンス(System.Type)から変換するのが主なお仕事になるね。その際に注意するのが、クラス一覧は名前空間を除去した形で利用したほうがいいということ。そりゃー、ダイアログのあの小さい領域にフルフル名称で表示されていたら見づらいのでね。

とりあえずここまで準備できればあとは実際のプロパティ側で属性を指定すればOK。
そこは次回で。

0 件のコメント:

コメントを投稿