C#:反射的使用

1.引入命名空间

using System.Reflection  才能使用相关的类

因为是用窗体应用做测试,所以还要引用输出窗口做打印, using System.Diagnostics

2.新建一个测试类 MyClass (文件名不影响类名),并单独放一个空间 myspace中

新建的测试类要包括private私有成员和public公有成员和static静态成员,方便测试全面

代码如下:

using System;
using System.Diagnostics;

namespace mySpace {

    public class MyClass {
        private static int number;
        private int id=0;
        public String name;

        private MyClass() {

        }

        public MyClass(String name) {
            this.name = name;
        }

        public int getId() {
            return id;
        }

        private String testPrivateMethod(String s1 , int s2) {
            Debug.WriteLine("");
            Debug.WriteLine("private {0}   {1}",s1,s2);
            return "private "+s1+"   "+s2;
        }
        

    }

}

重点看下属性 id 和方法 testPrivateMethod是私有的

3.反射操作如下,所有的逻辑是写在一个按钮的点击事件中,可自行修改

private void button1_Click(object sender, EventArgs e) {

            mySpace.MyClass myclass = new mySpace.MyClass("liuyan");

            //获取所有成员
            Type type = typeof(mySpace.MyClass);
            //范围设置如下
            //BindFlags.NonPublic     非public公共成员
            //BindFlags.Instance      类实例,要通过反射调用,这个必须引入
            //BindFlags.Public        public公共成员
            //BindFlags.Static        静态成员
            //BindFlags.DeclaredOnly  不获取父类成员,只获取本身类的成员
            //MemberInfo[] infos = type.GetMembers(); 只获取公共成员
            MemberInfo[] infos = type.GetMembers(
                BindingFlags.NonPublic|BindingFlags.Public|BindingFlags.Instance|
                BindingFlags.DeclaredOnly|BindingFlags.Static
                );
            //成员类型有(Method.Filed.Constructor)
            foreach (MemberInfo info in infos) {
                Debug.WriteLine("成员名: {0}   类型: {1}",info.Name,info.MemberType);
            }

            //获取单个属性Field成员
            //myclass.id; //不能访问到,且不能设值,因为id是私有的,下面通过反射操作:
            FieldInfo field = type.GetField("id",BindingFlags.NonPublic|BindingFlags.Instance);
            field.SetValue(myclass,2018);
            Debug.WriteLine("");
            Debug.WriteLine(field.GetValue(myclass));

            //获取单个方法Method成员
            //myclass.testPrivateMethod("newvalue",2018) //无法操作,因为该方法私有,下面通过反射操作:
            MethodInfo method = type.GetMethod("testPrivateMethod",BindingFlags.NonPublic|BindingFlags.Instance);
            //Debug.WriteLine(method.ReturnType); //方法返回类型
            //invoke:调用的意思
            //参数需传入Object[]{}
            method.Invoke(myclass,new Object[] {"newvalue",2018 });

            //通过MemberInfo获取单个成员
            //member.toString()包含了成员名和(成员类型或返回值类型)
            MemberInfo member1 = type.GetMember("id", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)[0];
            Debug.WriteLine("");
            Debug.WriteLine("成员名: {0}  类型: {1}  {2}", member1.Name, member1.MemberType, member1.ToString());
            MemberInfo member2 = type.GetMember("name", BindingFlags.Public|BindingFlags.NonPublic | BindingFlags.Instance)[0];
            Debug.WriteLine("");
            Debug.WriteLine("成员名: {0}  类型: {1}  {2}",member2.Name,member2.MemberType,member2.ToString());
            MemberInfo member3 = type.GetMember("testPrivateMethod", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)[0];
            Debug.WriteLine("");
            Debug.WriteLine("成员名: {0}  类型: {1}  {2}", member3.Name, member3.MemberType, member3.ToString());
        }

猜你喜欢

转载自blog.csdn.net/qq_38261174/article/details/84890229