给定一个整数参数,我试图动态调用对象上的索引器。例如
Public Class MyC
Default Public ReadOnly Property Items(index As Integer) As String
Get
Return "Integer indexer"
End Get
End Property
Default Public ReadOnly Property items(x As String) As String
Get
Return "String indexer"
End Get
End Property
End Class
...
dim obj as MyC = new MyC()
dim result as string = obj(10) 'Invoke property without using reflection
如果我想动态地调用索引器,而无需假定特定的属性名称,并且考虑到索引器可能超载的事实,我可以这样做:
Dim a As Object = obj.GetType().InvokeMember("", Reflection.BindingFlags.GetProperty, Nothing, obj, {10})
Dim b As Object = obj.GetType().InvokeMember("", Reflection.BindingFlags.GetProperty, Nothing, obj, {"str"})
这些行方便地根据我传入的参数数组确定要调用的索引器。
现在,如果可能的话,我想通过实际存储属性(作为PropertyInfo对象)来提高性能,因此不必在每次调用该属性时都重新计算该属性。
有没有一种方法可以检索默认成员索引器的特定重载,并在不调用该方法的情况下实际存储该方法?
Dim obj = new MyC()
' Get all default members
Dim defaultmembers = obj.GetType().GetDefaultMembers().Cast(Of PropertyInfo)()
' Get the 'Int32' overload the hard way
Dim intIndex = defaultmembers.Single(Function(m) m.GetGetMethod().GetParameters().Single().ParameterType = GetType(Integer))
' Get the 'String' overload the easy way :-)
Dim stringIndex = defaultmembers.Single(Function(m) m.ToString().Contains("[System.String]"))
' create delegates
Dim intFunc As Func(Of Int32, String) = System.Delegate.CreateDelegate(GetType(Func(Of Int32, String)), obj, intIndex.GetGetMethod())
Dim strFunc As Func(Of String, String) = System.Delegate.CreateDelegate(GetType(Func(Of string, String)), obj, stringIndex.GetGetMethod())
' Now you can call them
Console.WriteLine(intFunc(10))
Console.WriteLine(strFunc("12"))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句