请问Type.GetMethod的第二个参数有什么作用?

Imcx 2016-12-28 12:00:22
我想动态调用一个有Create方法的类,这个Create是一个静态的方法

然后我做了下面的测试:

上图只有m0和m2是有值的,其他的都null

这个是Create方法的部分信息
...全文
595 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
BindingFlags.Instance | BindingFlags.Static 被搞晕了,这种才是矛盾的存在 位运算没毛病,要求枚举子项的值是2的幂 不过&是用来判断是否存在某个枚举位的,比如 if((flags & BindingFlags.Instance) == BindingFlags.Instance) 用来像那样作过滤条件就变成零了,反而找不到了
圣殿骑士18 2016-12-28
  • 打赏
  • 举报
回复
过滤条件呀。。。
真相重于对错 2016-12-28
  • 打赏
  • 举报
回复
引用 13 楼 dongxinxi 的回复:
看了备注就说得过去了,BindingFlags.Instance 或 BindingFlags.Static这两个是必须要带一个的,因为同名方法这两种完全可以共存 BindingFlags这种Flags枚举, BindingFlags.Instance & BindingFlags.Static 这表示即是实例成员同时还是静态成员,这根本就矛盾了,能取到才怪 &通常是用来判断是否包含,你可以直接用HasFlags ^通常用来移除某个子项的标志位
应该说的不太对 比如 BindingFlags.Instance=0x2;(二进制10) BindingFlags.Static =0x4;(二进制100) BindingFlags.Instance & BindingFlags.Static =0 BindingFlags.Instance | BindingFlags.Static =0x6;(二进制110)
xuzuning 2016-12-28
  • 打赏
  • 举报
回复
是的,Type.GetMethod 的第二个参数 是过滤条件 如果给了,则只会返回符合条件的项 注意:这个条件不是表达式,而是一个经过位运算的值
Imcx 2016-12-28
  • 打赏
  • 举报
回复
原来是我弄错这个运算符的意思了吗。。。
  • 打赏
  • 举报
回复
看了备注就说得过去了,BindingFlags.Instance 或 BindingFlags.Static这两个是必须要带一个的,因为同名方法这两种完全可以共存 BindingFlags这种Flags枚举, BindingFlags.Instance & BindingFlags.Static 这表示即是实例成员同时还是静态成员,这根本就矛盾了,能取到才怪 &通常是用来判断是否包含,你可以直接用HasFlags ^通常用来移除某个子项的标志位
crystal_lz 2016-12-28
  • 打赏
  • 举报
回复
| -> 或运算 || -> 短路或
cheng2005 2016-12-28
  • 打赏
  • 举报
回复
引用 10 楼 Imcx_ 的回复:
[quote=引用 9 楼 wddw1986 的回复:] https://msdn.microsoft.com/zh-cn/library/05eey4y9(v=vs.100).aspx MSDN上写的很清楚,作为开发人员不看MSDN在这乱猜也真是浪费时间。
引用
为了获取返回值,必须指定 BindingFlags.Instance 或 BindingFlags.Static。
嗯,我在最初的参数里使用了这两种 可是只有Public | Static可以,为什么Public | Instance 不行呢?[/quote] 你自己都说了“Create是一个静态的方法”,那为什么Public | Instance 要行呢? 这个flag可不是 Public 和Instance 都行的意思。Public | Instance 是把两种标识合并到一起了,其实就是要求“Public且 Instance”
Imcx 2016-12-28
  • 打赏
  • 举报
回复
引用 9 楼 wddw1986 的回复:
https://msdn.microsoft.com/zh-cn/library/05eey4y9(v=vs.100).aspx MSDN上写的很清楚,作为开发人员不看MSDN在这乱猜也真是浪费时间。
引用
为了获取返回值,必须指定 BindingFlags.Instance 或 BindingFlags.Static。
嗯,我在最初的参数里使用了这两种 可是只有Public | Static可以,为什么Public | Instance 不行呢?
cheng2005 2016-12-28
  • 打赏
  • 举报
回复
https://msdn.microsoft.com/zh-cn/library/05eey4y9(v=vs.100).aspx MSDN上写的很清楚,作为开发人员不看MSDN在这乱猜也真是浪费时间。
引用
为了获取返回值,必须指定 BindingFlags.Instance 或 BindingFlags.Static。
Imcx 2016-12-28
  • 打赏
  • 举报
回复

MSDN上是这样写的

BindingFlags 枚举

.NET Framework (current version) 其他版本 
 
指定控制绑定以及通过反射执行成员和类型搜索的方式的标记。
此枚举具有允许其成员值的按位组合的 FlagsAttribute 特性。
难道是把这个枚举的值做了位计算的吗?
Imcx 2016-12-28
  • 打赏
  • 举报
回复
引用 5 楼 dongxinxi 的回复:
可能是,未指定过滤条件时,用的是方法特征.HasFlag(过滤条件)来匹配,也就方法中只要有满足条件的就调用
如果指定了,方法特征 == 过滤条件, 只有完全匹配才会调用

上面是根据结果猜测的,还是去看源代码直接点


我简化了一下类型

这里还是只有0和2有结果


神奇的是这里,在查找某个方法时单个参数是无效的
  • 打赏
  • 举报
回复
其实这个问题之前也碰到过,没去深究,指定BindingFlags时必须小心
  • 打赏
  • 举报
回复
可能是,未指定过滤条件时,用的是方法特征.HasFlag(过滤条件)来匹配,也就方法中只要有满足条件的就调用 如果指定了,方法特征 == 过滤条件, 只有完全匹配才会调用 上面是根据结果猜测的,还是去看源代码直接点
Imcx 2016-12-28
  • 打赏
  • 举报
回复
引用 3 楼 crystal_lz 的回复:
这么神奇的? 按理来说 2有值 那么 4 和 6 至少其中一个会有值
是的,我就是奇怪这一点!!!
crystal_lz 2016-12-28
  • 打赏
  • 举报
回复
这么神奇的? 按理来说 2有值 那么 4 和 6 至少其中一个会有值
Imcx 2016-12-28
  • 打赏
  • 举报
回复
引用 1 楼 daixf_csdn 的回复:
过滤条件呀。。。
可是我这样写为什么会m2有值的同时 m4 和 m6没有值啊

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧