リフレクションを使用して名前でオブジェクトのプロパティにアクセスし、get メソッドを呼び出しています。これは、プロパティごとに PropertyInfo をキャッシュしたとしても、数千回の反復で比較的遅い操作です。デリゲートを使用してより高速なものを考え出そうとしていますが、VB.Net では、コンパイル時にプロパティの戻り値の型を知らずにオブジェクトで CreateDelegate を呼び出すことはできません。これどうやってするの?
- (文字列) 名前でプロパティにアクセスします
- プロパティの戻り値の型はコンパイル時に不明です
- オブジェクトの何千ものインスタンスの 1 つ以上のプロパティにすばやくアクセスするデリゲートを作成しようとしています
編集:コードは次のとおりです
testC は、名前でアクセスしているプロパティを含むサンプル オブジェクトです。del は、testC のインスタンスでプロパティを呼び出すために使用するデリゲートです。
Public Class testC
Public Property prop1 As String
Public Property prop2 As Double
Public Property prop3 As Integer
Public Property prop4 As String
Public Property prop5 As String
Public Property prop6 As String
End Class
Public Delegate Function del() As Object
各プロパティに初めてアクセスするときは、リフレクションを使用してその名前からプロパティを取得し、デリゲートを構築して、将来オブジェクトの他のインスタンスですばやくアクセスできるようにします。
Dim pi As Reflection.PropertyInfo = obj.GetType().GetProperty(propName)
Dim myDelegate As Object = System.Delegate.CreateDelegate(GetType(del), pi.GetGetMethod())
CreateDelegate を呼び出すと、次の例外がスローされます。
System.ArgumentException: 署名またはセキュリティ透過性がデリゲート型のものと互換性がないため、ターゲット メソッドにバインドできません。