如果我使用
sometype.GetProperties();
我从类型中获取所有属性,并且它是父级。但是我只想检索在这种类型中显式定义的属性(而不是父类)。我认为那是BindingFlags.DeclaredOnly
选项的用途。
然而,当我尝试这个时:
sometype.GetProperties(BindingFlags.DeclaredOnly);
我得到0个属性。
任何人都知道我做错了什么?
答案 0 :(得分:79)
如果指定任何BindingFlags
,则需要明确指定要获取的属性。例如:
sometype.GetProperties (BindingFlags.DeclaredOnly |
BindingFlags.Public |
BindingFlags.Instance);
答案 1 :(得分:44)
总结:
如果您使用GetProperties()
重载(不带参数),您将获得所有公共属性。
另一方面,如果使用GetProperties(BindingFlags)
重载(接受BindingFlags
参数的重载),则需要指定每个组中至少一个的按位OR以下标志:
BindingFlags.Instance
/ BindingFlags.Static
(实例与静态属性),BindingFlags.Public
/ BindingFlags.NonPublic
(公共与非公共财产)。 例如,要获取公共静态属性,您需要调用GetProperties(BindingFlags.Public | BindingFlags.Static)
才能获得结果。仅呼叫GetProperties(BindingFlags.Public)
或GetProperties(BindingFlags.Static)
不会返回任何结果。
另请注意,指定BindingFlags.Default
将返回空数组。
详情请见MSDN documentation for GetProperties(BindingFlags):
以下BindingFlags 过滤器标志可用于定义要包含在搜索中的嵌套类型:
- 您必须指定
BindingFlags.Instance
或BindingFlags.Static
才能获得回报。- 指定
BindingFlags.Public
以在搜索中包含公共属性。- 指定
BindingFlags.NonPublic
以在搜索中包含非公共方法(即私有,内部和受保护方法)。仅返回基类上的受保护和内部方法;不返回基类的私有方法。- 指定
BindingFlags.FlattenHierarchy
以在层次结构中包含公共和受保护的静态成员;不包括继承类中的私有静态成员。以下BindingFlags 修饰符标记可用于更改搜索的工作方式:
BindingFlags.DeclaredOnly
仅搜索在Type上声明的属性,而不是仅继承的属性。
答案 2 :(得分:15)
您需要稍微扩展BindingsFlag。他们需要至少包括可访问性级别和实例与静态,以便获得任何有意义的东西。
我认为您实际需要的是以下内容
var flags = BindingFlags.DeclaredOnly
| BindingFlags.Instance
| BindingFlags.Public;
someType.GetProperties(flags);
答案 3 :(得分:0)
答案 4 :(得分:-1)
我在使用typeof(Thing)
时遇到了问题,最终这对我有用:
var thisThing = (new Thing()).GetType();
foreach (var property in thisThing.GetProperties())
{
// ...
}