.NET反射示例

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data;

using System.Reflection;

 

namespace 反射

{

    class Program

    {

        static void Main(string[] args)

        {

            ReflcetionTest test = new ReflcetionTest();

            test.ClassMemberInfo();

 

 

            Console.ReadLine();

        }

 

    }

 

    /// <summary>

    /// 调试类。

    /// </summary>

    public class ReflcetionTest

    {

        /// <summary>

        /// Assembly类:程序集信息。

        /// </summary>

        public void AssemblyTest()

        {

            Console.WriteLine("/t/t" + "------------Assembly类的使用------------");

            Console.WriteLine();

 

            //获取当前所执行代码的程序集信息

            Assembly myAssembly = Assembly.GetExecutingAssembly();          

 

            Console.WriteLine("获取程序集位置:{0}", myAssembly.CodeBase);

            Console.WriteLine("获取此程序集的入口点:{0}", myAssembly.EntryPoint);

            Console.WriteLine("获取程序集的显示名称:{0}", myAssembly.FullName);

            Console.WriteLine("获取包含当前程序集清单的模块:{0}", myAssembly.ManifestModule);

            Console.WriteLine();

 

            //获取当前程序集的名称及信息

            AssemblyName asmName = myAssembly.GetName();

 

            Console.WriteLine("获取或设置程序集的简单名称:{0}", asmName.Name);

            Console.WriteLine("获取程序集的全名:{0}", asmName.FullName);

            Console.WriteLine("获取或设置程序集的RUL位置:{0}", asmName.CodeBase);

            Console.WriteLine("获取或设置程序集的主版本号、次版本号、内部版本号和修订版本号:{0}", asmName.Version);

            Console.WriteLine();

 

            //获取当前程序集的版本相关信息

            System.Version asmVersion = asmName.Version;

            Console.WriteLine("获取当前程序集的主版本号:{0}", asmVersion.Major);

            Console.WriteLine("获取当前程序集的次版本号:{0}", asmVersion.Minor);

            Console.WriteLine("获取当前程序集的内部版本号:{0}",asmVersion.Build);

            Console.WriteLine("获取当前程序集的修订版本号:{0}",asmVersion.MajorRevision);

            Console.WriteLine();

 

        }

 

        /// <summary>

        /// Type类:检索类信息。

        /// </summary>

        public void TypeTest()

        {

            Console.WriteLine("/t/t" + "------------Type类的使用------------");

            Console.WriteLine();

 

            //设置被检索的类

            Type myType = Type.GetType("反射.WeiMei");

 

            //检索信息

            Console.WriteLine("获取当前成员名称:{0}", myType.Name);

            Console.WriteLine("获取当前完全限定名(不包括程序集):{0}",myType.FullName);

            Console.WriteLine("获取当前Type所在的空间名称:{0}", myType.Namespace);

            Console.WriteLine();

 

            //检索类成员

            Console.WriteLine("获取方法相关信息:{0}", myType.GetMethod("MetName").ToString());

            Console.WriteLine("获取属性相关信息:{0}", myType.GetProperty("ProName").ToString());

            Console.WriteLine("获取字段相关信息:{0}", myType.GetField("mName", BindingFlags.NonPublic | BindingFlags.Instance).ToString());

            Console.WriteLine();

 

            //设定自己为被检索的类

            Type myThis = this.GetType();

        }

 

        /// <summary>

        /// 访问类成员。

        /// </summary>

        public void ClassMemberInfo()

        {

            //指定被访问的类。

            Type WMtype = Type.GetType("反射.WeiMei");

 

            // 或者这样指定被访问的类

            // WeiMei myWeiMei = new WeiMei();

            // Type WMtype = myWeiMei.GetType();

 

            Console.WriteLine("/t/t" + "------------MemberInfo访问类的所有成员------------");

            Console.WriteLine();

            //MemberInfo类:遍历被访问类的所有成员。

            MemberInfo[] members = WMtype.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);

            foreach (MemberInfo member in members)

            {

                Console.WriteLine("成员名称:{0}--------" + "成员类型:{1}", member.Name, member.MemberType);

            }

            Console.WriteLine();

            //-------------------------------------------------------------------------------------------------------------------------------------------

           

            Console.WriteLine("/t/t" + "------------MethodInfo访问类的方法------------");

            Console.WriteLine();

            //MethodInfo类:遍历被访问类的方法。

            MethodInfo[] methods = WMtype.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);

            foreach (MethodInfo method in methods)

            {

                Console.WriteLine("方法名称:{0}--------" + "方法类型:{1}", method.Name, method.ReturnType);

            }

            Console.WriteLine();

            //-------------------------------------------------------------------------------------------------------------------------------------------

           

            Console.WriteLine("/t/t" + "------------PropertyInfo访问类的属性------------");

            Console.WriteLine();

            //PropertyInfo类:遍历被访问类的属性。

            PropertyInfo[] propertys = WMtype.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);

            foreach (PropertyInfo property in propertys)

            {

                Console.WriteLine("属性名称:{0}--------" + "属性类型:{1}", property.Name, property.PropertyType);

            }

            Console.WriteLine();

            //-------------------------------------------------------------------------------------------------------------------------------------------

           

            Console.WriteLine("/t/t" + "------------FieldInfos访问类的字段------------");

            Console.WriteLine();

            //FieldInfo类:遍历被访问类的字段。

            FieldInfo[] fields = WMtype.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);

            foreach (FieldInfo field in fields)

            {

                Console.WriteLine("字段名称:{0}--------" + "字段类型:{1}", field.Name, field.FieldType);

            }

            Console.WriteLine();

            //-------------------------------------------------------------------------------------------------------------------------------------------

           

            Console.WriteLine("/t/t" + "------------ConstructorInfo访问类的构造函数------------");

            Console.WriteLine();

            //ConstructorInfo类:遍历被访问类的构造函数。

            ConstructorInfo[] constructors = WMtype.GetConstructors(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);

            foreach (ConstructorInfo constructor in constructors)

            {

                Console.WriteLine("构造函数名称:{0}--------" + "构造函数类型:{1}", constructor.Name, constructor.MemberType);

            }

            Console.WriteLine();

            //-------------------------------------------------------------------------------------------------------------------------------------------

 

            Console.WriteLine("/t/t" + "------------EventInfo用于访问类的事件元数据------------");

            Console.WriteLine();

            //EventInfo类:遍历被访问类的事件。

            EventInfo[] eventinfos = WMtype.GetEvents(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);

            foreach (EventInfo eventinfo in eventinfos)

            {

                Console.WriteLine("事件名称:{0}--------" + "成员类型:{1}", eventinfo.Name, eventinfo.MemberType);

            }

            Console.WriteLine();

            //-------------------------------------------------------------------------------------------------------------------------------------------

 

            Console.WriteLine("/t/t" + "------------ParameterInfo用于表示参数的元数据------------");

            Console.WriteLine();

            //ParameterInfo类:检索WeiMei类中的MetName方法()的参数

            MethodInfo myMethod = WMtype.GetMethod("TestName");

            ParameterInfo[] paramets = myMethod.GetParameters();

            int count = 0;

            foreach (ParameterInfo paramet in paramets)

            {

                count++;

                Console.WriteLine("参数" + count + "名称:{0};类型:{1}", paramet.Name,paramet.ParameterType);

            }

            Console.WriteLine();

 

        }

 

        /// <summary>

        /// 操作类成员。

        /// </summary>

        public void OperMembers()

        {

            //指定被访问的类。

            WeiMei weiMeiObj = new WeiMei();

            Type WMtype = weiMeiObj.GetType();

 

            // 或者这样指定被访问类

            // Type WMtype = Type.GetType("反射.WeiMei");

 

            //操作方法

            string[] parName = new String[] { "WeiMeiHua" };  //方法参数的值

            MethodInfo method = WMtype.GetMethod("MetName");

            method.Invoke(weiMeiObj, parName);

            Console.WriteLine("操作方法改变值后为:{0}", weiMeiObj.ProName);

 

            //操作属性

            PropertyInfo proper = WMtype.GetProperty("ProName");

            proper.SetValue(weiMeiObj, "HuaWeiMei", null);

            Console.WriteLine("操作属性改变值后为:{0}", weiMeiObj.ProName);

 

            //操作字段

            FieldInfo field = WMtype.GetField("mName", BindingFlags.NonPublic | BindingFlags.Instance);

            field.SetValue(weiMeiObj, "WeiMei");

            Console.WriteLine("操作字段改变值后为:{0}", weiMeiObj.ProName);

            Console.WriteLine();

 

            //操作事件

            EventInfo eventInfo = WMtype.GetEvent("WMShout");

            Console.WriteLine("声明该成员的类:{0}", eventInfo.DeclaringType);

            Console.WriteLine("事件名称:{0}", eventInfo.Name);

            Console.WriteLine("事件类型:{0}", eventInfo.MemberType);

            Console.WriteLine();

        }

    }

 

    /// <summary>

    /// 被检索/访问的类。

    /// </summary>

    public class WeiMei

    {

        //字段

        private  string mName;

        private string mSix;

        private int mAge;

 

        //构造函数

        public WeiMei()

        {

            mName = "LiuWeiMei";

            mSix= "gril";

            mAge = 20;

        }

 

        public WeiMei(string name, string six, int age)

        {

            mName = name;

            mSix = six;

            mAge = age;

        }

 

        //属性

        public string ProName

        {

            get { return mName; }

            set { mName = value; }

        }

 

        public string ProSix

        {

            get { return mSix; }

            set { mSix = value; }

        }

 

        public int ProAge

        {

            get { return mAge; }

            set { mAge = value; }

        }

 

        private string ProLoveYou

        {

            get { return "这是一个秘密,只有我才知道"; }

        }

 

        //方法

        public string MetName(string herName)

        {

            this.mName = herName;

            return mName;

        }

 

        public string MetSix(string herSix)

        {

            this.mSix = herSix;

            return mSix;

        }

 

        public int MetAge(int herAge)

        {

            this.mAge = herAge;

            return mAge;

        }

 

        private string MetLoveYou()

        {

            return "这是一个秘密,只有我才知道";

        }

 

        public string TestName(string herName, int like, float love)

        {

            this.mName = herName;

            return mName;

        }

 

        //声明委托

        public delegate string WMName(string wmName);

 

        //声明事件1

        public event WMName WMShout;

 

        //声明事件2

        private event WMName WMLove;

 

    }

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值