.NET Core中基類可以反射子類的成員


我們定義一個類DemoA,再定義一個類DemoB繼承DemoA。當構造一個DemoB類對象后,我們可以通過其調用基類DemoA中的方法來反射子類DemoB的成員。

新建一個.NET Core控制台項目,其代碼如下:

using System;

namespace RF
{
    /// <summary>
    /// DemoA類為基類
    /// </summary>
    class DemoA
    {
        /// <summary>
        /// 反射DemoA類及其子類的所有屬性成員
        /// </summary>
        public void DisplayProperties()
        {
            var properties = this.GetType().GetProperties();

            Console.WriteLine($"Properties in class: \"{this.GetType().Name}\" : ");

            foreach (var property in properties)
            {
                Console.WriteLine($"Property \"{property.Name}\" in class \"{property.DeclaringType.Name}\"");
            }

            Console.WriteLine();
        }

        /// <summary>
        /// DemoA類的屬性NumberA會被DisplayProperties方法所反射
        /// </summary>
        public int NumberA { get; set; }

        /// <summary>
        /// 由於DemoB類的Name屬性隱藏了DemoA類的Name屬性,所以在DemoB類中調用DemoA類的DisplayProperties方法時,DemoA類的Name屬性不可見,反射的是DemoB類中的Name屬性
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 由於DemoB類的Age屬性重寫了DemoA類的Age屬性,所以在DemoB類中調用DemoA類的DisplayProperties方法時,DemoA類的Age屬性不可見,反射的是DemoB類中的Age屬性
        /// </summary>
        public virtual int Age { get; set; }

    }

    /// <summary>
    /// DemoB類繼承DemoA類,在DemoB類的對象上調用DemoA類的DisplayProperties方法時,也會反射DemoB類的所有屬性
    /// </summary>
    class DemoB : DemoA
    {
        /// <summary>
        /// DemoB類的屬性NumberB也會被DisplayProperties方法所反射
        /// </summary>
        public int NumberB { get; set; }

        /// <summary>
        /// 由於DemoB類的Name屬性隱藏了DemoA類的Name屬性,所以在DemoB類中調用DemoA類的DisplayProperties方法時,DemoA類的Name屬性不可見,反射的是DemoB類中的Name屬性
        /// </summary>
        public new string Name { get; set; }

        /// <summary>
        /// 由於DemoB類的Age屬性重寫了DemoA類的Age屬性,所以在DemoB類中調用DemoA類的DisplayProperties方法時,DemoA類的Age屬性不可見,反射的是DemoB類中的Age屬性
        /// </summary>
        public override int Age { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            DemoA demo = new DemoA();//構造DemoA類對象
            demo.DisplayProperties();//通過DemoA類的對象調用DisplayProperties方法,反射DemoA類的所有屬性

            demo = new DemoB();//構造DemoB類對象
            demo.DisplayProperties();//通過DemoB類的對象調用DisplayProperties方法,反射DemoB類和DemoA類的所有屬性

            Console.WriteLine("Press key to quit...");
            Console.ReadKey();
        }
    }
}

執行上面的代碼,結果如下所示:

可以看到DemoA類的DisplayProperties方法,不光可以反射DemoA類的所有屬性成員,當DisplayProperties方法被DemoB類的對象調用時還可以反射DemoB類的所有屬性成員。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM