共用方式為


System.Type.GetProperty 方法

本文提供此 API 參考文件的補充備註。

下列指引適用於所有重載:

  • 如果屬性至少有一個存取子是公用的,則在反射中視為公用的。 否則,屬性會被視為私用屬性,而且您必須使用 BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static (在 Visual Basic 中,使用 結合 值 Or來取得它。
  • 如果目前的 Type 代表建構的泛型型別,這個方法會傳回 PropertyInfo ,其型別參數會由適當的型別自變數所取代。
  • 如果目前的 Type 代表泛型型別或泛型方法定義中的型別參數,這個方法會搜尋類別條件約束的屬性。

GetProperty(String) 方法

name的搜尋會區分大小寫。 搜尋範圍包括公共靜態屬性和公共實例屬性。

發生的情況 AmbiguousMatchException 包括下列各項:

  • 類型包含兩個具有相同名稱但不同參數數目的索引屬性。 若要解決模棱兩可的情況,請使用指定參數類型的方法多載 GetProperty
  • 衍生類型會宣告屬性,這個屬性會使用 new 修飾詞 (Shadows 在 Visual Basic 中)隱藏具有相同名稱的繼承屬性。 若要解決模棱兩可的情況,請使用 GetProperty(String, BindingFlags) 方法多載並新增 BindingFlags.DeclaredOnly 旗標,將搜尋限制為未繼承的成員。

GetProperty(String, BindingFlags) 方法

下列 BindingFlags 篩選旗標可用來定義要包含在搜尋中的屬性:

  • 您必須指定 BindingFlags.InstanceBindingFlags.Static ,才能取得傳回。
  • 指定 BindingFlags.Public 以在搜尋中包含公用屬性。
  • 指定 BindingFlags.NonPublic 以在搜尋中包含非公用屬性(也就是私用、內部和受保護的屬性)。
  • 指定 BindingFlags.FlattenHierarchy 以在階層中包含 publicprotected 的靜態成員,但不包括 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 Interop 呼叫,而且只會處理以傳址方式傳遞的參數時使用。

下表顯示當檢視類型結構時,Get 方法會傳回基類的哪些成員。

成員類型 靜態的 非靜態
建構函式
領域 是的。 欄位總是根據名稱和簽章進行隱藏。
事件 不適用 常見的類型系統規則是繼承與實作 屬性的方法相同。 反射會將屬性視為依名稱及簽章隱藏。2
方法 是的。 方法(虛擬和非虛擬)可以是依名稱隱藏或依名稱及簽名隱藏。
巢狀類型
房產 不適用 常見的類型系統規則是繼承與實作 屬性的方法相同。 反射會將屬性視為依名稱及簽章隱藏。2

注意事項:

  • 依名稱和簽章隱藏會考慮簽章的所有部分,包括自訂修飾詞、返回類型、參數類型、標記符號 (sentinels) 和非受控呼叫慣例。 這是二進位比較。
  • 針對反射,屬性和事件是依名稱及簽章隱藏。 如果您的屬性在基類中同時具有 get 和 set 存取子,但衍生類別只有 get 存取子,衍生類別屬性會隱藏基類屬性,而且您將無法存取基類上的 setter。
  • 自訂屬性不是一般類型系統的一部分。

下列 BindingFlags 篩選旗標可用來定義要包含在搜尋中的屬性:

  • 您必須指定 BindingFlags.InstanceBindingFlags.Static ,才能取得傳回。
  • 指定 BindingFlags.Public 以在搜尋中包含公用屬性。
  • 指定 BindingFlags.NonPublic 以在搜尋中包含非公用屬性(也就是私用、內部和受保護的屬性)。
  • 指定 BindingFlags.FlattenHierarchy 以在階層中包含 publicprotected 的靜態成員,但不包括 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 屬性會傳回預設屬性的名稱。