在.NETreflection中使用GetProperties()和BindingFlags.DeclaredOnly
如果我使用
sometype.GetProperties();
我从types中获得所有的属性,它是父类。 不过,我只想检索在这种types(而不是父母)明确定义的属性。 我以为这是BindingFlags.DeclaredOnly
选项的目的。
但是,当我尝试这个:
sometype.GetProperties(BindingFlags.DeclaredOnly);
我得到0个属性。
任何人都知道我在做什么错了?
如果您指定了任何BindingFlags
,那么您需要明确指定要获取的属性。 例如:
sometype.GetProperties (BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance);
总结:
-
如果您使用
GetProperties()
重载(不带参数),您将获得所有公共属性 。 -
另一方面,如果使用
GetProperties(BindingFlags)
重载(接受BindingFlags
参数的重载),则需要为每组下列标志中的至less一个指定一个按位或:-
BindingFlags.Instance
/BindingFlags.Static
(实例vs静态属性), -
BindingFlags.Public
/BindingFlags.NonPublic
(公共vs非公共属性)。
-
例如,要获取公共静态属性,您需要调用GetProperties(BindingFlags.Public | BindingFlags.Static)
以获得结果。 只调用GetProperties(BindingFlags.Public)
或GetProperties(BindingFlags.Static)
不会返回任何结果。
还要注意,指定BindingFlags.Default
将返回一个空数组 。
详细信息可以在GetProperties(BindingFlags)的MSDN文档中find:
以下BindingFlags 过滤标志可用于定义search中包含的嵌套types:
- 您必须指定
BindingFlags.Instance
或BindingFlags.Static
才能获得回报。- 指定
BindingFlags.Public
在search中包含公共属性。- 指定
BindingFlags.NonPublic
在search中包含非公共方法(即私有,内部和受保护的方法)。 只有基类的保护和内部方法被返回; 基类上的私有方法不会被返回。- 指定
BindingFlags.FlattenHierarchy
在层次结构中包含公共和受保护的静态成员; 不包括inheritance类中的私有静态成员。以下BindingFlags 修饰符标志可用于更改search的工作方式:
BindingFlags.DeclaredOnly
仅search在Type上声明的属性,而不是仅仅inheritance的属性。
你需要扩展你的BindingsFlag。 他们至less需要包括什么访问级别和实例与静态以获得任何有意义的东西。
我觉得你实际上在寻找的是以下内容
var flags = BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public; someType.GetProperties(flags);
从MSDN网站。
默认(成员)指定没有绑定标志。
您必须指定实例或静态一起Public或NonPublic或没有成员将被返回。
因此除非你指定绑定标志,
我使用typeof(Thing)
有问题,最终这对我工作:
var thisThing = (new Thing()).GetType(); foreach (var property in thisThing.GetProperties()) { // ... }