1

これをどう説明したらよいかわかりませんが、FromXml という共有 (ファクトリ) 関数を含む基本クラスを作成しようとしています。この関数で適切な型のオブジェクトをインスタンス化し、XmlDocument を介して入力する必要があります。

たとえば、次のようなものがあるとします。

Public Class XmlObject
    Public Shared Function FromXml(ByVal source as XmlDocument) As XmlObject
        // <need code to create SPECIFIC TYPE of object and return it
    End Function
End Class

Public Class CustomObject
    Inherits XmlObject
End Class

私はこのようなことをしたいと思います:

Dim myObject As CustomObject = CustomObject.FromXml(source)

これは可能ですか?

4

2 に答える 2

1

まず、FromXml 関数は、作成して返す必要があるオブジェクトの型を認識している必要があります。これを行うには、次のいずれかを実行できます。

型自体をパラメーターとして渡します。

Public Shared Function FromXml(ByVal source As XmlDocument, _
                               ByVal resultType As Type) As XmlObject
End Function

ジェネリックを使用する:

Public Shared Function FromXml(Of T)(ByVal source As XmlDocument) As XmlObject

End Function

(ジェネリックを使用すると、たとえば、"Of T as XmlObject" を指定して、T で XmlObject に割り当て可能なクラスのみを受け取ることもできます)。

次に、渡された型の新しいオブジェクトをインスタンス化する方法を決定する必要があります。渡された正確な型を調査し、それに応じて新しいインスタンスを作成する (ハードコード) か、Reflection を使用して、渡された型のコンストラクター メソッドを呼び出すことができます (アクセス可能なコンストラクターがあると仮定します) (こちらのを参照)。T に空のコンストラクターがない場合は、コンストラクターの引数を調べて、matchin デリゲートを呼び出す必要があるため (ここでもリフレクションを使用します)、これは少し注意が必要です。

于 2010-03-19T14:55:02.233 に答える
0

関数に特定の型で何かを行うように指示したい場合は、ジェネリック パラメーターを関数に追加するだけです。これが最初の意図を達成するための最良の方法であるかどうかはわかりませんが、仕事は完了します。

   Public Class XmlObject
      Public Shared Function FromXml(Of T)(ByVal source As XmlDocument) As T
         Dim result As T = Activator.CreateInstance(GetType(T))

         Return result
      End Function
   End Class
于 2010-03-19T14:48:42.450 に答える