我正在使用反射按名称访问对象的属性,以调用 get 方法。即使我为每个属性缓存 PropertyInfo,这也是一个相对较慢的操作,需要数千次迭代。我正在尝试使用委托更快地想出一些东西,但是 VB.Net 不允许我在不知道编译时属性的返回类型的情况下对对象调用 CreateDelegate。我怎样才能做到这一点?
- 我通过它们的(字符串)名称访问属性
- 编译时属性的返回类型未知
- 我正在尝试创建一个委托来快速访问数千个对象实例的一个或多个属性
编辑:代码如下
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:无法绑定到目标方法,因为它的签名或安全透明度与委托类型的不兼容。