.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类的所有属性成员。

 

转载于:https://www.cnblogs.com/OpenCoder/p/9873225.html

### C# 中基类访问 `protected` 成员的规则 在 C# 中,`protected` 访问修饰符允许派生类访问基类中被标记为 `protected` 的成员。然而,基类本身并不能直接访问其自身的 `protected` 成员[^3]。这是因为 `protected` 修饰符的设计初衷是确保某些成员只能在类内部或派生类中被访问,而不能从外部直接访问。 以下是对 C# 中基类访问 `protected` 成员规则的详细说明: 1. **基类无法直接访问自身的 `protected` 成员**: 在基类中,`protected` 成员仅限于在同一类的实例方法或属性中被访问。如果尝试通过基类的静态上下文或其他方式访问 `protected` 成员,则会导致编译错误[^4]。 2. **派生类可以访问基类的 `protected` 成员**: 派生类可以通过其自身实例或基类实例访问基类中的 `protected` 成员。例如,如果派生类创建了一个基类类型的引用,并指向派生类实例,则可以通过该引用访问基类的 `protected` 成员。 3. **访问限制与对象实例相关**: 即使在派生类中,也不能通过其他类型的实例访问 `protected` 成员。例如,如果在派生类中创建了基类的实例,则无法通过该实例访问基类的 `protected` 成员[^3]。 #### 示例代码 以下代码展示了基类和派生类对 `protected` 成员的访问规则: ```csharp class BaseClass { protected string ProtectedProperty { get; set; } = "Base Property"; public void AccessProtected() { // 基类可以直接访问自身的 protected 成员 Console.WriteLine(ProtectedProperty); // 正确 } } class DerivedClass : BaseClass { public void TestAccess() { // 派生类可以通过自身访问基类的 protected 成员 Console.WriteLine(this.ProtectedProperty); // 正确 // 派生类可以通过基类实例访问基类的 protected 成员 BaseClass baseInstance = new DerivedClass(); Console.WriteLine(baseInstance.ProtectedProperty); // 正确 // 如果通过基类实例访问,则无法访问 protected 成员 BaseClass pureBaseInstance = new BaseClass(); // Console.WriteLine(pureBaseInstance.ProtectedProperty); // 错误 } } ``` #### 注意事项 - 如果在派生类中试图通过基类的实例访问 `protected` 成员,则会引发编译错误,因为 `protected` 成员只能在派生类实例中被访问。 - 基类无法直接通过静态上下文访问其自身的 `protected` 成员,因为 `protected` 成员本质上是非静态的[^4]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值