2007年9月19日水曜日

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

今回はConvertFrom関係。前の記事で書いたように「ある型・クラスから、このTypeConverterで扱う型・クラスに変換」にちなんだ処理を行うのがこのメソッド。

プロパティダイアログで利用する場合は「String ←→ System.Type」と変換できればよいので、CanConvertFromメソッドでは、ある型=StringであればTrueを返却するようにコーディングすればOK。

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

こんな感じで大丈夫。そしてConvertFromメソッドでは実際の変換処理を記述してあげればOK。内部でプロパティでSystem.Typeを指定したい?(3)の時に書いたロジックを使うのでそこも参照してください。

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

こんな具合かな?利用できるクラスの一覧を取得して、一覧に存在するクラスが指定された際にはそのTypeを返却する。一覧に存在しない際はNullを返却する。返却する際には一覧で保持しているクラス名から、実際のインスタンスを生成(System.Activator.CreateInstance)して、そのTypeを取得しています。

とまあ、こんな感じでFrom関係のメソッドも大したことがないのよね。To関係のメソッドもそれほど違いはないので、次回の記事と見比べてもらうといいかも。

0 件のコメント:

コメントを投稿