• [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个。

  • 相关阅读:
    第九周上机作业
    购物商城
    安卓第四周作业
    第十五周作业
    第十三周作业-集合
    第十三周上机练习
    第十二周作业
    上机练习 5.21
    java第十一周作业
    java第十一周上机练习
  • 原文地址:https://www.cnblogs.com/cncc/p/8249768.html
Copyright © 2020-2023  润新知