System.Type.GetProperty 方法

本文提供了此 API 参考文档的补充说明。

GetProperty(String) 方法

搜索 name 区分大小写。 搜索包括公共静态和公共实例属性。

如果属性至少有一个访问器是公共的,则将其视为公共的反射。 否则,该属性被视为私有属性,并且必须使用BindingFlags.NonPublic | | BindingFlags.InstanceBindingFlags.Static(在 Visual Basic 中,将值组合在一Or起)来获取它。

如果当前 Type 表示构造的泛型类型,此方法将返回 PropertyInfo 由相应类型参数替换的类型参数。

如果当前 Type 表示泛型类型或泛型方法定义中的类型参数,此方法将搜索类约束的属性。

发生 AmbiguousMatchException 的情况包括:

  • 类型包含两个具有相同名称但不同数量的参数的索引属性。 若要解决歧义,请使用指定参数类型的方法的 GetProperty 重载。
  • 派生类型使用修饰符Shadows(在 Visual Basic 中)声明一个属性,new该属性隐藏具有相同名称的继承属性。 若要解决歧义,请使用 GetProperty(String, BindingFlags) 方法重载并添加 BindingFlags.DeclaredOnly 标志以将搜索限制为未继承的成员。

GetProperty(String, BindingFlags) 方法

如果属性至少有一个访问器是公共的,则将其视为公共的反射。 否则,该属性被视为私有属性,并且必须使用BindingFlags.NonPublic | | BindingFlags.InstanceBindingFlags.Static(在 Visual Basic 中,将值组合在一Or起)来获取它。

以下 BindingFlags 筛选器标志可用于定义要在搜索中包含哪些属性:

  • 必须指定或BindingFlags.InstanceBindingFlags.Static用于获取返回结果。
  • 指定 BindingFlags.Public 在搜索中包含公共属性。
  • 指定 BindingFlags.NonPublic 在搜索中包含非公共属性(即专用属性、内部属性和受保护属性)。
  • 指定 BindingFlags.FlattenHierarchy 为包含 public 层次结构中的静态成员和 protected 静态成员; private 不包括继承类中的静态成员。

以下 BindingFlags 修饰符标志可用于更改搜索的工作原理:

  • BindingFlags.IgnoreCase 如果忽略 .,则 name
  • BindingFlags.DeclaredOnly 如果仅搜索声明 Type的属性,则不搜索只是继承的属性。

有关详细信息,请参阅System.Reflection.BindingFlags

如果当前 Type 表示构造的泛型类型,此方法将返回 PropertyInfo 由相应类型参数替换的类型参数。

如果当前 Type 表示泛型类型或泛型方法定义中的类型参数,此方法将搜索类约束的属性。

发生 AmbiguousMatchException 的情况包括:

  • 类型包含两个具有相同名称但不同数量的参数的索引属性。 若要解决歧义,请使用指定参数类型的方法的 GetProperty 重载。
  • 派生类型声明一个属性,该属性使用 new 修饰符(Shadows 在 Visual Basic 中)隐藏具有相同名称的继承属性。 若要解决歧义,请包括 BindingFlags.DeclaredOnly 将搜索限制为未继承的成员。

GetProperty(System.String,System.反应离子。BindingFlags,System。反应。Binder,System.Type,System.Type[],System.反应。ParameterModifier[])

如果属性至少有一个访问器是公共的,则将其视为公共的反射。 否则,该属性被视为私有属性,并且必须使用BindingFlags.NonPublic | | BindingFlags.InstanceBindingFlags.Static(在 Visual Basic 中,将值组合在一Or起)来获取它。

尽管默认联编程序不处理 ParameterModifiermodifiers 参数),但可以使用抽象 System.Reflection.Binder 类编写一个处理自定义 modifiers联编程序。 ParameterModifier 仅在通过 COM 互操作调用时使用,并且仅处理通过引用传递的参数。

下表显示了在反映类型时方法返回 Get 的基类成员。

成员类型 静态 非静态
构造函数
字段 是的。 字段始终是按名称和签名隐藏的。
活动 不适用 常见的类型系统规则是继承与实现属性的方法相同。 反应ion 将属性视为按名称隐藏和签名。2
方法 是的。 方法(虚拟和非虚拟)可以是按名称隐藏或按名称隐藏和签名。
嵌套类型
properties 不适用 常见的类型系统规则是继承与实现属性的方法相同。 反应ion 将属性视为按名称隐藏和签名。2

注意:

  1. 按名称隐藏和签名考虑签名的所有部分,包括自定义修饰符、返回类型、参数类型、sentinels 和非托管调用约定。 这是二进制比较。
  2. 对于反射,属性和事件是按名称和签名隐藏的。 如果基类中同时具有 get 和 set 访问器的属性,但派生类只有 get 访问器,则派生类属性将隐藏基类属性,并且无法访问基类上的 setter。
  3. 自定义属性不是常见类型系统的一部分。

以下 BindingFlags 筛选器标志可用于定义要在搜索中包含哪些属性:

  • 必须指定或BindingFlags.InstanceBindingFlags.Static用于获取返回结果。
  • 指定 BindingFlags.Public 在搜索中包含公共属性。
  • 指定 BindingFlags.NonPublic 在搜索中包含非公共属性(即专用属性、内部属性和受保护属性)。
  • 指定 BindingFlags.FlattenHierarchy 为包含 public 层次结构中的静态成员和 protected 静态成员; private 不包括继承类中的静态成员。

以下 BindingFlags 修饰符标志可用于更改搜索的工作原理:

  • BindingFlags.IgnoreCase 如果忽略 .,则 name
  • BindingFlags.DeclaredOnly 如果仅搜索声明 Type的属性,则不搜索只是继承的属性。

有关详细信息,请参阅System.Reflection.BindingFlags

如果当前 Type 表示构造的泛型类型,此方法将返回 PropertyInfo 由相应类型参数替换的类型参数。

如果当前 Type 表示泛型类型或泛型方法定义中的类型参数,此方法将搜索类约束的属性。

索引器和默认属性

Visual Basic、C# 和 C++ 简化了用于访问索引属性的语法,并允许一个索引属性作为其类型的默认值。 例如,如果变量 myList 引用了一个 ArrayList,则语法 myList[3]myList(3) 在 Visual Basic 中)检索索引为 3 的元素。 可以重载属性。

在 C# 中,此功能称为索引器,不能按名称引用。 默认情况下,C# 索引器在元数据中显示为名为 <a0/a0> 的索引属性。 但是,类库开发人员可以使用 IndexerNameAttribute 属性更改元数据中的索引器的名称。 例如,该 String 类具有一个名为 Chars[] 的索引器。 使用 C# 以外的语言创建的索引属性也可以具有其他 Item名称。

若要确定类型是否具有默认属性,请使用 GetCustomAttributes(Type, Boolean) 该方法测试 DefaultMemberAttribute 属性。 如果该类型具有 DefaultMemberAttribute,则 MemberName 属性返回默认属性的名称。