本文提供此 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.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 Interop 呼叫,而且只會處理以傳址方式傳遞的參數時使用。
下表顯示當檢視類型結構時,Get 方法會傳回基類的哪些成員。
| 成員類型 | 靜態的 | 非靜態 |
|---|---|---|
| 建構函式 | 否 | 否 |
| 領域 | 否 | 是的。 欄位總是根據名稱和簽章進行隱藏。 |
| 事件 | 不適用 | 常見的類型系統規則是繼承與實作 屬性的方法相同。 反射會將屬性視為依名稱及簽章隱藏。2 |
| 方法 | 否 | 是的。 方法(虛擬和非虛擬)可以是依名稱隱藏或依名稱及簽名隱藏。 |
| 巢狀類型 | 否 | 否 |
| 房產 | 不適用 | 常見的類型系統規則是繼承與實作 屬性的方法相同。 反射會將屬性視為依名稱及簽章隱藏。2 |
注意事項:
- 依名稱和簽章隱藏會考慮簽章的所有部分,包括自訂修飾詞、返回類型、參數類型、標記符號 (sentinels) 和非受控呼叫慣例。 這是二進位比較。
- 針對反射,屬性和事件是依名稱及簽章隱藏。 如果您的屬性在基類中同時具有 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 屬性會傳回預設屬性的名稱。