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

  • 相关阅读:
    C++ 将对象写入文件 并读取
    IronPython fail to add reference to WebDriver.dll
    How to Capture and Decrypt Lync Server 2010 TLS Traffic Using Microsoft Tools
    .net code injection
    数学系学生应该知道的十个学术网站
    Difference Between Currency Swap and FX Swap
    Swift开源parser
    谈谈我对证券公司一些部门的理解(前、中、后台)[z]
    JDK8记FullGC时候Metaspace内存不会被垃圾回收
    JVM源码分析之JDK8下的僵尸(无法回收)类加载器[z]
  • 原文地址:https://www.cnblogs.com/cncc/p/8249768.html
Copyright © 2011-2022 走看看