[英]Get properties from class object using reflection where property should be public and having get or get and set both
如何使用带有反射的 BindingFlags 来获取那些是公共的并用 get value 或 get 和 set value 装饰的属性。
我使用了以下代码,但它不返回任何属性。
var properties = obj.GetType().GetProperties(BindingFlags.Public & BindingFlags.Instance & BindingFlags.GetProperty);
另一个答案是正确的,但缺乏解释。
这里有一个违反直觉的操作,即使用|
合并标志。 运算符创建一个在语义上充当“与”值的合并标志。
这与人类使用“和”的方式与冷逻辑不同有关。 例如:
汤姆和鲍勃能够修理汽车。
这并不意味着Tom && Bob
(他们俩)必须在场才能修好汽车,而是意味着Tom || Bob
Tom || Bob
(即至少其中一个)需要在场才能修理汽车。
类似地,虽然英语中的“and”通常表示逻辑 OR,但英语中的“or”通常表示逻辑 XOR。
你可以吃汉堡或奶昔。
这通常意味着您可以选择一个,而不是两个,使其成为异或(XOR)。
始终要非常小心英语与逻辑中的“和/或”。 人类并不像你希望的那样合乎逻辑。
为了举例,让我们说
BindingFlags.Public = 0001
BindingFlags.Instance = 0010
我们想要实现的是一个组合标志,其中两个标志都存在,所以0011
。
当您使用&
时,当两个值都有 1 位时,结果将仅包含 1 位。
0001 // BindingFlags.Public
0010 // BindingFlags.Instance
& ----
0000 // No flags
由于结果是“无标志”(全为 0),因此您要求GetProperties()
返回未设置任何绑定标志的对象。 而且由于BindingFlags
是一组全面的标志,因此没有没有标志的对象。
当您使用|
,结果将组合至少一个成员具有的所有 1 位。
0001 // BindingFlags.Public
0010 // BindingFlags.Instance
| ----
0011 // BindingFlags.Public "and" BindingFlags.Instance
在这种情况下,您要求GetProperties()
返回同时设置了Public
和Instance
标志的对象(即它们的第三和第四位必须为 1)
所以,简而言之,为了得到一个组合的“A和B”标志,你必须计算A | B
A | B
。
您不应该使用按位与( &
),而是按位或( |
):
var properties = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.