本文提供了此 API 参考文档的补充说明。
以下指南适用于所有重载:
- 如果属性至少有一个访问器是公共的,则将该属性视为可供反射的公共属性。 否则,该属性被视为私有属性,并且必须使用BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static(在 Visual Basic 中,将值组合在一
Or
起)来获取该属性。 - 如果当前 Type 表示已构造的泛型类型,则此方法返回的 PropertyInfo 中,类型参数已被相应的类型实参替换。
- 如果当前 Type 表示泛型类型或泛型方法定义中的类型参数,此方法将搜索类约束的属性。
GetProperty(String) 方法
搜索 name
区分大小写。 搜索包括公共静态和公共实例属性。
发生 AmbiguousMatchException 的情况包括:
- 类型包含两个具有相同名称但不同数量的参数的索引属性。 若要解决歧义,请使用指定参数类型的 GetProperty 方法的重载。
- 派生类型通过使用
new
修饰符(在 Visual Basic 中为Shadows
),声明一个属性,该属性会隐藏具有相同名称的继承属性。 若要解决歧义,请使用 GetProperty(String, BindingFlags) 方法重载并添加 BindingFlags.DeclaredOnly 标志以将搜索限制为未继承的成员。
GetProperty(String, BindingFlags) 方法
以下 BindingFlags 筛选器标志可用于定义要在搜索中包含哪些属性:
- 您必须指定
BindingFlags.Instance
或BindingFlags.Static
才能获得返回结果。 - 指定
BindingFlags.Public
在搜索中包含公共属性。 - 指定
BindingFlags.NonPublic
在搜索中包含非公共属性(即专用属性、内部属性和受保护属性)。 - 指定
BindingFlags.FlattenHierarchy
为包含public
层次结构中的静态成员和protected
静态成员;private
不包括继承类中的静态成员。
以下 BindingFlags 修饰符标志可用于更改搜索的工作原理:
-
BindingFlags.IgnoreCase
用于忽略name
的大小写。 -
BindingFlags.DeclaredOnly
仅搜索在Type中声明的属性,而不是继承的属性。
发生 AmbiguousMatchException 的情况包括:
- 类型包含两个具有相同名称但不同数量的参数的索引属性。 若要解决歧义,请使用指定参数类型的 GetProperty 方法的重载。
- 派生类型声明一个属性,该属性使用
new
修饰符(Shadows
在 Visual Basic 中)隐藏具有相同名称的继承属性。 若要解决歧义,请包括 BindingFlags.DeclaredOnly 将搜索限制为未继承的成员。
GetProperty(System.String、System.Reflection.BindingFlags、System.Reflection.Binder、System.Type、System.Type[]、System.Reflection.ParameterModifier[]) 方法
尽管默认联编程序不处理 ParameterModifier ( modifiers
参数),但可以使用抽象 System.Reflection.Binder 类编写一个处理自定义 modifiers
联编程序。
ParameterModifier
仅在通过 COM 互作调用时使用,并且仅处理通过引用传递的参数。
下表显示了通过 Get
方法在反射类型时返回的基类成员。
成员类型 | 静态的 | 非静态 |
---|---|---|
构造函数 | 否 | 否 |
领域 | 否 | 是的。 字段始终是按名称和签名隐藏的。 |
事件 / 活动 | 不適用 | 常见的类型系统规则是继承与实现属性的方法相同。 反射将属性视为通过名称和签名进行隐藏。2 |
方法 | 否 | 是的。 方法(虚拟和非虚拟)可以按名称隐藏或按名称和签名隐藏。 |
嵌套类型 | 否 | 否 |
资产 | 不適用 | 常见的类型系统规则是继承与实现属性的方法相同。 反射将属性视为通过名称和签名进行隐藏。2 |
注释:
- 按名称和签名隐藏会考虑签名的所有部分,包括自定义修饰符、返回类型、参数类型、sentinel 和非托管调用约定。 这是二进制比较。
- 对于反射,属性和事件通过名称和签名进行隐藏。 如果基类中同时具有 get 和 set 访问器的属性,但派生类只有 get 访问器,则派生类属性将隐藏基类属性,并且无法访问基类上的 setter。
- 自定义属性不是常见类型系统的一部分。
以下 BindingFlags 筛选器标志可用于定义要在搜索中包含哪些属性:
- 您必须指定
BindingFlags.Instance
或BindingFlags.Static
才能获得返回结果。 - 指定
BindingFlags.Public
在搜索中包含公共属性。 - 指定
BindingFlags.NonPublic
在搜索中包含非公共属性(即专用属性、内部属性和受保护属性)。 - 指定
BindingFlags.FlattenHierarchy
为包含public
层次结构中的静态成员和protected
静态成员;private
不包括继承类中的静态成员。
以下 BindingFlags 修饰符标志可用于更改搜索的工作原理:
-
BindingFlags.IgnoreCase
用于忽略name
的大小写。 -
BindingFlags.DeclaredOnly
仅搜索在Type中声明的属性,而不是继承的属性。
索引器和默认属性
Visual Basic、C# 和 C++的语法简化了访问索引属性的语法,并允许一个索引属性作为其类型的默认值。 例如,如果变量 myList
引用了一个 ArrayList,则语法 myList[3]
(myList(3)
在 Visual Basic 中)检索索引为 3 的元素。 你可以重载此属性。
在 C# 中,此功能称为索引器,不能按名称引用。 默认情况下,C# 索引器在元数据中显示为名为 Item
的索引属性。 但是,类库开发人员可以使用 IndexerNameAttribute 属性更改元数据中的索引器的名称。 例如,该 String 类具有一个名为 Chars[] 的索引器。 使用 C# 以外的语言创建的索引属性可以具有与 Item
不同的名称。
若要确定类型是否具有默认属性,请使用 GetCustomAttributes(Type, Boolean) 该方法测试 DefaultMemberAttribute 属性。 如果该类型具有 DefaultMemberAttribute,则 MemberName 属性返回默认属性的名称。