.NETにおけるリフレクション技術は、学習曲線がやや急な機能ですが、一度習得すれば非常に柔軟なプログラミングが可能になります。この記事では、DSAPI.DLLに実装された簡易リフレクション操作用の機能について解説します。
DSAPI.DLLでは、以下のようなアセンブリ操作機能が実装されています:
- アセンブリ内の全フォーム取得
- アセンブリ内のフォーム名一覧取得
- 特定接頭辞付きフォーム取得
- 特定接頭辞付きフォーム名取得
- 特定フォームインスタンス生成
- メンバー存在確認
- メソッド実行
- オブジェクトのシリアル化/逆シリアル化
使用例:
Dim forms As List(Of Form) = DSAPI.ReflectionUtil.GetAllForms("c:\test.dll")
指定したアセンブリファイルに含まれるすべてのフォームオブジェクトをリスト形式で取得します。
Dim formNames As List(Of String) = DSAPI.ReflectionUtil.GetFormNames("c:\test.dll")
アセンブリ内に定義されているすべてのフォーム名を文字列リストとして取得します。
Dim filteredForms As List(Of Form) = DSAPI.ReflectionUtil.GetFormsByPrefix("c:\test.dll", "Win_")
接頭辞「Win_」で始まるフォームのみを取得します。
Dim filteredNames As List(Of String) = DSAPI.ReflectionUtil.GetFormNamesByPrefix("c:\test.dll", "Win_")
接頭辞条件に合致するフォーム名を文字列リストとして取得します。
Dim targetForm As Form = DSAPI.ReflectionUtil.CreateSpecificForm("c:\test.dll", "MainWindow")
指定したアセンブリ内で定義されている特定名前のフォームをインスタンス化します。
Dim exists As Boolean = DSAPI.ReflectionUtil.ContainsMember("c:\test.dll", "LoginDialog")
アセンブリ内に指定名のメンバーが存在するか確認します。
Dim result As Integer = DSAPI.ReflectionUtil.ExecuteFunction("c:\test.dll", "DataProcessor", "Calculate", "42")
指定したアセンブリ内の特定クラスに定義されたメソッドを実行します。引数は必須ですが、未使用でも構いません。
例えば以下のようなメソッド:```
Public Function Calculate(value As Integer) As Integer
Return value * 2
End Function
**シリアル化機能の使用例**
以下のようなゲームデータクラスがあるとします:```
Public Class GameProgress
Public Property Title As String = "Default"
Public Property Stage As Integer = 1
Public Property Score As Integer = 0
End Class
このクラスのインスタンスを保存・復元する処理は次のようになります:``` Sub SaveLoadTest() Dim serializer As New DSAPI.ReflectionUtil.Serializer Dim progress As New GameProgress With {.Title = "Adventure", .Stage = 3, .Score = 1500}
' ファイルへの保存
serializer.Serialize("c:\game.sav", progress)
' メモリストリームへの保存
Dim stream As New IO.MemoryStream
serializer.Serialize(stream, progress)
' ファイルからの復元
Dim loadedData As GameProgress = serializer.Deserialize("c:\game.sav")
' ストリームからの復元
stream.Position = 0
Dim loadedFromStream As GameProgress = serializer.Deserialize(stream)
End Sub