zoukankan      html  css  js  c++  java
  • [C#]如何访问及调用类中私有成员及方法


    本文为原创文章、源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称、作者及网址,谢谢!


    开发工具:VS2017

    语言:C#

    DotNet版本:.Net FrameWork 4.0及以上

    系统:Win10 X64

    一、首先建立一个控制台APP,并命名为ConsoleApp,如下图所示:

    二、新建一个Person类,并在类里面添加两个成员,一个是name字段,另外一个是Display方法,该方法带有一个“前缀”输入参数prefix,用于加在name字段前面,如下代码所示:

        class Person
        {
            string name;
            void Display(string prefix)
            {
                Console.WriteLine($"{prefix},{name}");
            }
        }

    三、将System.Reflection引用进来,这里是本随笔的关键所在,如下图所示:

    using System.Reflection;

    四、如何设置及访问name字段?在这里我们使用反射技术,使用Type类里的反射机制进行访问,

    1)公用部分,具体代码如下:

     Person person = new Person();
     Type type = typeof(Person);
     BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance;
     FieldInfo fInfo = type.GetField("name", flags);

    2)设置name字段,设置方法如下代码所示:

     fInfo.SetValue(person,"CNXY");

    3)访问name字段,访问方法如下代码所示:

    var name = fInfo.GetValue(person);

    4)name字段结果如下:

    说明:

    BindingFlags.NonPublic:搜索非公有方法的成员;

    BindingFlags.Instance:搜索成员实例,包括字段及方法等。

    五、如何访问Display私有方法?同样,借用第四部分代码(person及flags),具体代码如下:

    MethodInfo mInfo = type.GetMethod("Display",flags);
    mInfo.Invoke(person, new object[] { "Hello" });

    输出结果如下:

    说明:

    Invoke用于调用方法,后面的参数使用数组的方法,如有一个参数,则输入一个参数的object数组,如有多个参数,则输入多个参数的object数组。

    六、源代码如下:

    七、实际用处,System.Windows.Forms下面有一个类,名叫NotifyIcon,其设置的Text只能是63个字符,所想输入大于63个字符,如下设置方法是行不通的,代码如下:

    NotifyIcon ni = new NotifyIcon();
    ni.Text = "64个字符(实际有64个字符,这里并没有达到个数,仅作展示)";

    那么,我们必须另外的方法来绕过NotifyIcon的限制,这里使用了反射技术(也就是以上所说的),代码如下:

    NotifyIcon ni = new NotifyIcon();
    string text = "大于63个字符,小于127个字符的字符串";
    if (text.Length >= 128) throw new ArgumentOutOfRangeException("Text limited to 127 characters");
    Type t = typeof(NotifyIcon);
    BindingFlags hidden = BindingFlags.NonPublic | BindingFlags.Instance;
    t.GetField("text", hidden).SetValue(ni, text);
    if ((bool)t.GetField("added", hidden).GetValue(ni)) t.GetMethod("UpdateIcon", hidden).Invoke(ni, new object[] { true });

    以上的限制个数为大于63个,小于127个。

  • 相关阅读:
    json-c初探(一)
    Java程序员跳槽的首选面试题最新合集(2021下半年),初中高级程序员!
    R语言版本的bedtools--bedtoolsr
    使用R语言(cpm包)进行序列变点(change point)检测
    三款PHP大马,已解密、去后门
    php 取出数据表数据放入数组并排序
    VimTutor每讲小结
    记录一下c++学习过程
    vmware fusion关闭自动挂起(suspend)的方法
    mac中安装mysqlclient出错error: command 'clang' failed with exit status 1的解决办法
  • 原文地址:https://www.cnblogs.com/cncc/p/8249768.html
Copyright © 2011-2022 走看看