欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#反射之基础应用实例总结

程序员文章站 2023-12-19 10:27:40
本文将反射的东西整理了一下 , 提供了最全面的东西 , 当然也是基础的东西 , 在学好了这一切的基础上 , 大家可以学习反射的具体插件等应用 首先我们建立一个类库 , 将...

本文将反射的东西整理了一下 , 提供了最全面的东西 , 当然也是基础的东西 ,
在学好了这一切的基础上 , 大家可以学习反射的具体插件等应用 首先我们建立一个类库 , 将它生成为 reflectprj .dll,
 

复制代码 代码如下:
using system;
using system.collections.generic;
using system.text;
 
namespace reflectprj
{
    /// <summary>
    /// 接口
    /// </summary>
    public interface interface1
    {
        int add(int num);
        int add();
    }
    /// <summary>
    /// 用来被测试的类
    /// </summary>
    public class reflecttest : interface1
    {
  
        public string writea;
 
        public string writea
        {
            get { return writea; }
            set { writea = value ; }
        }
 
        public string writeb;
 
        public string writeb
        {
            get { return writeb; }
            set { writeb = value ; }
        }
 
        public reflecttest()
        {
            this .writea = "writea" ;
            this .writeb = "writeb" ;
        }
 
        public reflecttest(string a, string b)
        {
            this .writea = a;
            this .writeb = b;
        }
 
        public int add()
        {
            return 100;
        }
        public int add(int num)
        {
            return num;
        }
 
        public string writestring(string a,string b)
        {
             return " 欢迎你," + a + "------" +b;
      
        }
 
        public static string writename(string s)
        {
            return " 欢迎光临," + s;
        }
 
        public string writenopara()
        {
            return " 你使用的是无参数方法!" ;
        }
 
        private string writeprivate()
        {
            return " 私有类型的方法!" ;
        }
    }
}

 
之后再建立一个项目引入该 reflectprj .dll
 
复制代码 代码如下:
using system;
using system.collections.generic;
using system.text;
using reflectprj;
using system.threading;
using system.reflection;
 
namespace reflectprjtest
{
    class myreflecttest
    {
        // 建立委托
        delegate string testdelegate (string a,string b);
 
        static void main(string [] args)
        {
            assembly assembly= assembly .load("reflectprj" );
 
            foreach (type var in assembly.gettypes())
            {
                console .writeline(var.name);// 显示dll 下所有的类
            }
 
            //*******************************************************
 
            module [] modules = assembly.getmodules();
 
            foreach (module module in modules)
            {
                console .writeline("module( 模块/ 组件) 名:" +module.name);
            }
 
            //*******************************************************
            // 得到具体的类的类型
            type a = typeof (reflectprj.reflecttest );
          
            console .writeline(a.name);
 
            //*******************************************************
            //a------ 创建类型的实例----> 此处是由带参的构造函数的来得到的实例
            string [] paras ={"aaa" ,"bbb" };
            // 创建该类的实例,后面的paras 为有参构造函数的参数----> 此obj 即是类型a 的一个实例
            // 此实例调用的是一个带参的构造函数
            object obj = activator .createinstance(a,paras);
 
            // 得到对象的属性
            console .writeline(" 得到对象a 的属性:" );
            foreach (object var in a.getproperties())
             {
                 console .writeline(var.tostring());
             }
          
            methodinfo [] miarr = a.getmethods();
 
            console .writeline(" 显示所有的共有方法:" );
            // 显示所有的共有方法
            foreach (methodinfo method in miarr)
            {
                console .writeline(method.name);
            }
          
            //************************************************************
            // 显示具体的方法
            console .writeline(" 显示具体的方法!" );
 
            //1. 带参的方法的使用
            methodinfo mi = a.getmethod("writestring" );
            string mireturn =(string ) mi.invoke(obj, new object [] { " 使用的是带参数的非静态方法" , "2" });
 
            console .writeline("---" +mi.name+" 返回值:" +mireturn);
 
            //2. 不带参数的方法调用
            console .writeline(" 不带参数的方法的调用:" );
            methodinfo minopara = a.getmethod("writenopara" );
 
            string minoparareturn = (string )minopara.invoke(obj, null );
 
            console .writeline("---" +minoparareturn);
 
            //3. 私有类型方法的使用
            console .writeline(" 私有类型方法的使用:" );
            methodinfo miprivate = a.getmethod("writeprivate" ,bindingflags .instance | bindingflags .nonpublic);
 
            string miprivatereturn = (string )miprivate.invoke(obj, null );
 
            console .writeline("---" +miprivatereturn);
 
            console .writeline("*********************** 属性的使用**********************" );
 
            //4. 得到对象的属性
            propertyinfo [] propertys = a.getproperties(bindingflags .instance | bindingflags .nonpublic |bindingflags .public);
         
            //5. 显示所有属性名
            console .writeline(" 对象的所有属性名如下:" );
            foreach (propertyinfo pro in propertys)
            {
                //console.writeline(pro.name);
                 // 获取属性最初的值
                console .writeline(pro.name+" :" +pro.getvalue(obj,null ));
 
                // 给属性重新赋值
                pro.setvalue(obj, " 张三丰" , null );
                console .writeline(pro.name + " :" + pro.getvalue(obj, null ));
 
             }
        
            //6. 获取指定的属性,并赋值
            propertyinfo propertyinfo=a.getproperty("writea" ,bindingflags .instance| bindingflags .nonpublic|bindingflags .public);
 
            propertyinfo.setvalue(obj, " 郁金香" , null );
 
            console .writeline(propertyinfo.name+" :" +propertyinfo.getvalue(obj,null ));
 
            console .writeline("*********************fieldinfo--- 公开字段的使用***********************" );
            //7. 字段的使用----> 只能获取公开字段
            fieldinfo f1 = a.getfield("writea" ,bindingflags .instance| bindingflags .nonpublic| bindingflags.public);
 
            console .writeline(f1.getvalue(obj));
 
            try
            {
                reflectprj.reflecttest test = new reflecttest ("marry" , "jack" );
 
                type myreflect = typeof (reflecttest );
 
                fieldinfo field1= myreflect.getfield("writea" , bindingflags .public | bindingflags .nonpublic |bindingflags .instance);
 
                console .writeline(field1.getvalue(test));
            }
            catch (exception ex)
             {
                console .writeline(ex.message);
            }
 
            //*******************************************************
            //8. 构造函数的使用
            console .writeline(" 获得构造函数的形式" );
            constructorinfo [] cis =a.getconstructors();
            foreach (constructorinfo ci in cis)
            {
                console .writeline(" 构造函数的形式:" +ci.tostring());// 获得构造函数的形式
                console .writeline(" 构造函数名称:" +ci.name);
            }
 
            // 打印带参构造函数的形式
            constructorinfo ascsingle = a.getconstructor(new type [] { typeof (string ),typeof (string )});
 
            console .writeline(ascsingle.tostring());
 
            //****************************************************
            //9. 工厂模式
            console .writeline(a.name);
            reflectprj.interface1 reflectobj2 = (interface1 )assembly.createinstance("reflectprj.reflecttest" );
            reflectprj.reflecttest reflectobj1 = (reflecttest )assembly.createinstance("reflectprj.reflecttest" );
 
            console .writeline(reflectobj2.add());// 典型的工厂模式,在后续真正应用中使用的是接口中的方法(而接口又由实现接口的类来实现)
            console .writeline(reflectobj1.writenopara());
 
            //10 工厂模式--- 方法的重载
            int num = 300;
            console .writeline(reflectobj1.add(300));
 
            console .writeline(" 工厂模式的再一次实现!" );
            foreach (type type in assembly.gettypes())
            {
                if (type.getinterface("reflectprj.interface1" )!=null )
                {
                    // 由接口的实现类来实现该接口
                    reflectprj.interface1 interfaceobj3 = (interface1 )activator .createinstance(a);
 
                    console .writeline(interfaceobj3.add());
                    console .writeline(interfaceobj3.add(600));
                }
            }
            //****************************************************
            //11. 动态创建委托的简单例子---> 将委托绑定到目标方法上
            testdelegate mymothod = (testdelegate )delegate .createdelegate(typeof (testdelegate ),obj,mi);
 
            console .writeline(mymothod.invoke("tom" , "jack" ));
 
            //****************************************************
            //b----------. 无参构造函数的使用
            console .writeline(" 无参构造函数的使用!" );
 
            //objnonepara 是由reflecttest 类的构造函数所产生的对象
            object objnonepara = activator .createinstance(a);
 
            string info=((reflectprj.reflecttest )objnonepara).writenopara();
 
            console .writeline(info);
 
            propertyinfo prowritea = a.getproperty(((reflecttest )objnonepara).writea);
            console .writeline(prowritea.getvalue(objnonepara,null ));
 
            prowritea.setvalue(objnonepara, " 小小郁金香" , null );
 
            console .writeline(prowritea.getvalue(objnonepara, null ));
 
            //c:--------- 再次用带参的构造函数来产生实例
            reflecttest objpara =(reflecttest ) activator .createinstance(a, new object [] {" 小郁" ," 来吧" });
            console .writeline(objpara.writea+"/t" +objpara.writeb);
            console .writeline(objpara.writenopara());
 
            // 调用带参的方法
            console .writeline(objpara.writestring(" 大郁" , " 回家吧!" ));
            methodinfo mymi=a.getmethod("writestring" );
 
             // 利用委托动态的将将委托绑定的指定的方法
            mymothod=(testdelegate )delegate .createdelegate(typeof (testdelegate ),objpara,mymi);
            console .writeline(mymothod.invoke(" 过年啦" , " 牛年快乐啊!" ));
 
            // 屏幕暂停
            console .readline();
        }
     }
}

希望本文所述对大家的c#程序设计有所帮助。

上一篇:

下一篇: