System.Type.GetProperty 方法

本文提供了此 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.InstanceBindingFlags.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[]) 方法

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

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

成员类型 静态的 非静态
构造函数
领域 是的。 字段始终是按名称和签名隐藏的。
事件 / 活动 不適用 常见的类型系统规则是继承与实现属性的方法相同。 反射将属性视为通过名称和签名进行隐藏。2
方法 是的。 方法(虚拟和非虚拟)可以按名称隐藏或按名称和签名隐藏。
嵌套类型
资产 不適用 常见的类型系统规则是继承与实现属性的方法相同。 反射将属性视为通过名称和签名进行隐藏。2

注释:

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

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

  • 您必须指定BindingFlags.InstanceBindingFlags.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 属性返回默认属性的名称。