繁体   English   中英

使用反射从 class object 获取属性,其中属性应该是公共的并且具有获取或获取并设置两者

[英]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()返回同时设置了PublicInstance标志的对象(即它们的第三和第四位必须为 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM