使用反射获取超载的默认成员

特伦特

给定一个整数参数,我试图动态调用对象上的索引器。例如

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

公共班级的默认成员

来自分类Dev

IcCube-忽略默认成员

来自分类Dev

如何获取 Ms Access 对象(或 VBA 中的任何其他对象)的默认成员

来自分类Dev

为什么默认成员值禁止使用括号列表初始化?

来自分类Dev

MVC5简单成员资格/默认成员资格

来自分类Dev

结构中的默认成员值或默认构造函数参数?

来自分类Dev

如何在COM库中标识“默认成员”?

来自分类Dev

当其为模板参数时默认成员变量指针

来自分类Dev

Umbraco覆盖或扩展默认成员资格提供程序

来自分类Dev

C ++ 11,默认成员构造是件好事吗?

来自分类Dev

如何使用反射获取静态成员的System.Type?

来自分类Dev

是否可以在默认成员初始化程序中调用非静态成员函数?

来自分类Dev

如何使用反射获取默认构造函数参数?

来自分类Dev

C ++ c-tor处理默认成员值构造异常?

来自分类Dev

ASP.NET:“找不到默认成员资格提供程序”错误

来自分类Dev

动态/ ExpandoObject方法抛出“找不到类型为“动作”的默认成员”

来自分类Dev

由于存在默认成员初始化程序,因此类类型不平凡

来自分类Dev

模板错误:每个默认成员都必须是字符串Coludformation yml

来自分类Dev

C ++ c-tor处理默认成员值构造异常?

来自分类Dev

Mvc中的自定义成员资格提供程序与默认成员资格提供程序。选择什么?

来自分类Dev

通过反射仅获取当前班级成员

来自分类Dev

使用反射获取属性

来自分类Dev

万无一失的副本超载:如何不照顾应该默认副本的成员?

来自分类Dev

在C#8.0中,有没有办法在类中公开默认成员实现?

来自分类Dev

非静态数据成员上的成员初始值设定项列表和默认成员初始值设定项有什么区别?

来自分类Dev

使用反射从类型成员校准方法

来自分类Dev

使用反射获取属性引用

来自分类Dev

使用反射获取元组的值

来自分类Dev

使用反射获取Java批注

Related 相关文章

  1. 1

    公共班级的默认成员

  2. 2

    IcCube-忽略默认成员

  3. 3

    如何获取 Ms Access 对象(或 VBA 中的任何其他对象)的默认成员

  4. 4

    为什么默认成员值禁止使用括号列表初始化?

  5. 5

    MVC5简单成员资格/默认成员资格

  6. 6

    结构中的默认成员值或默认构造函数参数?

  7. 7

    如何在COM库中标识“默认成员”?

  8. 8

    当其为模板参数时默认成员变量指针

  9. 9

    Umbraco覆盖或扩展默认成员资格提供程序

  10. 10

    C ++ 11,默认成员构造是件好事吗?

  11. 11

    如何使用反射获取静态成员的System.Type?

  12. 12

    是否可以在默认成员初始化程序中调用非静态成员函数?

  13. 13

    如何使用反射获取默认构造函数参数?

  14. 14

    C ++ c-tor处理默认成员值构造异常?

  15. 15

    ASP.NET:“找不到默认成员资格提供程序”错误

  16. 16

    动态/ ExpandoObject方法抛出“找不到类型为“动作”的默认成员”

  17. 17

    由于存在默认成员初始化程序,因此类类型不平凡

  18. 18

    模板错误:每个默认成员都必须是字符串Coludformation yml

  19. 19

    C ++ c-tor处理默认成员值构造异常?

  20. 20

    Mvc中的自定义成员资格提供程序与默认成员资格提供程序。选择什么?

  21. 21

    通过反射仅获取当前班级成员

  22. 22

    使用反射获取属性

  23. 23

    万无一失的副本超载:如何不照顾应该默认副本的成员?

  24. 24

    在C#8.0中,有没有办法在类中公开默认成员实现?

  25. 25

    非静态数据成员上的成员初始值设定项列表和默认成员初始值设定项有什么区别?

  26. 26

    使用反射从类型成员校准方法

  27. 27

    使用反射获取属性引用

  28. 28

    使用反射获取元组的值

  29. 29

    使用反射获取Java批注

热门标签

归档