首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 自動實作屬性在反射下的意外行為

     編輯:關於C語言

測試發現:當基底類別使用自動實作屬性 (Auto-Implemented Property) 時,對衍生類別執行反射取得欄位 (GetFields) 將無法取得對應的編譯器產生後端欄位;改用傳統手寫屬性則正常。

測試程式碼

// Person.cs - 基底類別
public class Person
{
    protected string _LastName; // 傳統欄位
    public string FirstName { get; set; } // 自動實作屬性
    public string LastName
    {
        get { return this._LastName; }
        set { this._LastName = value; }
    }
}

// Employee.cs - 衍生類別
public class Employee : Person
{
    protected string Title;
}

// Program.cs - 反射測試
static void Main()
{
    Console.WriteLine("Fields in Person instance:");
    Person objPerson = new Person();
    foreach (FieldInfo fi in objPerson.GetType().GetFields(
        BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
        Console.WriteLine(fi.Name);

    Console.WriteLine("\nFields in Employee instance:");
    Employee objEmployee = new Employee();
    foreach (FieldInfo fi in objEmployee.GetType().GetFields(
        BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
        Console.WriteLine(fi.Name);
}

執行結果

反射輸出結果

輸出顯示 Person 實例包含 _LastName 與編譯器產生的 <FirstName>k__BackingField,但 Employee 實例僅顯示 Title,缺少繼承自基底類別的自動實作屬性後端欄位。

結論

基底類別使用自動實作屬性時,衍生類別透過反射 GetFields 無法取得該屬性的後端欄位。若需反射相容性,建議改用傳統手寫屬性配合明確宣告的欄位。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved