子类用反射可以访问父类中的私有成员变量及方法

本文介绍如何在Unity中通过反射机制访问父类的私有成员变量及方法。具体展示了如何获取并修改父类私有变量的值,以及调用父类的私有方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通常子类是不能访问父类的私有的成员变量及私有的方法,哪怎么才能做到呢?利用反射可以很容易的做到,以下代码在unity中测试通过;

定义一个父类:


using UnityEngine;
using System.Collections;

public class TestBase : MonoBehaviour
{
    private int a = 1;

    public int b = 2;

    private void printPr()
    {
        Debug.Log("private method");
    }
    public void printPu()
    {
        Debug.Log("public method");
    }
}



父类中定义了私有成员变量 a 和私有方法printPr;

然后再声明一个类继承TestBase类:

using UnityEngine;
using System;
using System.Reflection;

public class TestOne : TestBase
{
    // Use this for initialization
    void Start()
    {
        analytical();
    }

    void analytical()
    {
        // 指明当前对象
        object obj = (TestBase)this;
        // 获取对象的类型
        Type type = obj.GetType();
        // 对象的父类类型
        type = type.BaseType;
        //字段绑定标志
        BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;
        // 获取type 中的 私有变量a
        FieldInfo ff = type.GetField("a", flag);
        // 给变量赋值
        ff.SetValue(obj, 123);
        // 读取变量值
        object value = ff.GetValue(obj);

        Debug.Log(value);

        //获取对象的私有方法print 
        MethodInfo mf = type.GetMethod("printPr", flag);
       // 实现对象中的方法
        mf.Invoke(obj, null);
    }

}

analytical方法中阐述了具体的解析逻辑。

反射是动态执行的(和oc的动态性类似),效率会比直接引用低,也可能会存在很多的异常,用时需谨慎。


反射 也可以通过类名创建类实例:(实例就不在此处列出了)

反射创建某个类的实例时,必须保证使用类的完全限定名(命名空间 + 类名)。Type.GetType 方法返回 null 则意味搜索元数据中的相关信息失败,请确保反射时使用类的完全限定名。

参考:https://msdn.microsoft.com/zh-cn/library/ms173183(VS.80).aspx


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值