zoukankan      html  css  js  c++  java
  • c# 反射的用法(非原创)

          在网上查找了不少的资料,可以说大同小异,概念性的东西网上一搜一堆,
    今天把反射的东西整理了一下,供大家使用,我保证我这里是最全面的东西,当然也是基础的东西,
    在学好了这一切的基础上,大家可以学习反射的具体插件等应用,老鸟就不用看了.
    首先我们建立一个类库,将它生成为HelloWorld.dll

    using System;

     namespace Webtest
     ...{

        public interface interface1
         ...{
              int add();
        
         }
         public class ReflectTest:interface1
         ...{
            
             public String Write;
             private String Writec;

             public String Writea
             ...{
                 get
                 ...{
                     return Write;
                 }
                 set
                 ...{
                     Write = value;
                 }
            
             }

             private String Writeb
             ...{
                 get
                 ...{
                     return Writec;
                 }
                 set
                 ...{
                     Writec = value;
                 }

             }

              public ReflectTest()
              ...{
                  this.Write = "Write";
                  this.Writec = "Writec";
              }

             public ReflectTest(string str1,string str2)
             ...{
                 this.Write = str1;
                 this.Writec = str2;
             }

             public string WriteString(string s,int b)
             ...{
                 return "欢迎您," + s + "---" + b; ;
             }

              public static string WriteName(string s)
              ...{
                 return "欢迎您光临," + s;
              }

             public string WriteNoPara()
             ...{
                return "您使用的是无参数方法";
             }

             private string WritePrivate()
             ...{
                 return "私有类型的方法";
             }


             public int add()
             ...{
                 return 5;
             }
         }
    }


    然后,建立再建立一个项目引入该HelloWorld.dll

    using System;

    using System.Threading;
    using System.Reflection;


    class Test
    ...{
        delegate string TestDelegate(string value,String value1);
        static void Main()
        ...{
            //Assembly t = Assembly.LoadFrom("HelloWorld.dll"); 与下面相同的效果
            Assembly t = Assembly.Load("HelloWorld");

    //**********************************************************************    
           foreach (Type aaa in t.GetTypes())
           ...{
                //Console.Write(aaa.Name);   //显示该dll下所有的类
            }

    //**********************************************************************
            Module[] modules = t.GetModules();

            foreach (Module module in modules)
            ...{
                //Console.WriteLine("module name:" + module.Name);//显示模块的名字本例为"HelloWorld.dll"
            }

    //**********************************************************************
            Type a = typeof(Webtest.ReflectTest);//得到具体的类的类型,和下面一个效果
            //Type a = t.GetType("Webtest.ReflectTest");//
            //Console.Write(a.Name);

    //**********************************************************************
            string[] bb =...{ "aaaa", "bbbbb" };
            object obj = Activator.CreateInstance(a,bb); //创建该类的实例,后面的bb为有参构造函数的参数
            //object obj = t.CreateInstance("Webtest.ReflectTest");//与上面方法相同

    //**********************************************************************       
            MethodInfo[] miArr = a.GetMethods();
            foreach (MethodInfo mi0 in miArr)
           ...{
                //Console.Write(mi0.Name);  //显示所有的共有方法
           }

    //**********************************************************************
            MethodInfo mi = a.GetMethod("WriteString");//显示具体的方法
            object[] aa=...{"使用的是带有参数的非静态方法",2};
            string s = (string)mi.Invoke(obj,aa); //带参数方法的调用

            MethodInfo mi1 = a.GetMethod("WriteName");
            String[] aa1 =...{"使用的是静态方法"};
            string s1 = (string)mi1.Invoke(null, aa1); //静态方法的调用

            MethodInfo mi2 = a.GetMethod("WriteNoPara");
            string s2 = (string)mi2.Invoke(obj, null); //不带参数的方法调用

            MethodInfo mi3 = a.GetMethod("WritePrivate",BindingFlags.Instance | BindingFlags.NonPublic);
            string s3 = (string)mi3.Invoke(obj, null); //私有类型方法调用

            //Console.Write(s3);

    //**********************************************************************
            PropertyInfo[] piArr = a.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
            foreach (PropertyInfo pi in piArr)
            ...{
             //Console.Write(pi.Name);  //显示所有的属性
            }

    //**********************************************************************
            PropertyInfo pi1=a.GetProperty("Writea");
            //pi1.SetValue(obj, "Writea", null);
            //Console.Write(pi1.GetValue(obj,null));

            PropertyInfo pi2 = a.GetProperty("Writeb", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
            pi2.SetValue(obj, "Writeb", null);
            //Console.Write(pi2.GetValue(obj, null));

            FieldInfo fi1 = a.GetField("Write");
            //Console.Write(fi1.GetValue(obj));

    //**********************************************************************
            ConstructorInfo[] ci1 = a.GetConstructors();
            foreach (ConstructorInfo ci in ci1)
            ...{
                //Console.Write(ci.ToString()); //获得构造函数的形式
            }

            ConstructorInfo asCI = a.GetConstructor(new Type[] ...{ typeof(string), typeof(string) });
            //Console.Write(asCI.ToString());

    //**********************************************************************
            Webtest.interface1 obj1 = (Webtest.interface1)t.CreateInstance("Webtest.ReflectTest");
            Webtest.ReflectTest obj2 = (Webtest.ReflectTest)t.CreateInstance("Webtest.ReflectTest");
            //Console.Write(obj1.add());典型的工厂模式

    //**********************************************************************
            foreach (Type tt in t.GetTypes())
            ...{
                if (tt.GetInterface("interface1")!=null)
                ...{
                    Webtest.interface1 obj3 = (Webtest.interface1)Activator.CreateInstance(a);
                    //Console.Write(obj3.add());
                }
            }

    //**********************************************************************
            TestDelegate method = (TestDelegate)Delegate.CreateDelegate(typeof(TestDelegate), obj, "WriteString");
           //动态创建委托的简单例子
            //Console.Write(method("str1", 2));

    //**********************************************************************
            ConstructorInfo asCI1 = a.GetConstructor(new Type[0]);
            Webtest.ReflectTest obj5 = (Webtest.ReflectTest)asCI1.Invoke(null);
                //通过无参构造函数实例化的方法
            //Console.Write(obj5.Writea);

            ConstructorInfo asCI2 = a.GetConstructor(new Type[] ...{ typeof(string), typeof(string) });
              //通过有参构造函数实例化的方法
            Webtest.ReflectTest obj6 = (Webtest.ReflectTest)asCI2.Invoke(bb);
            Console.Write(obj6.Writea);
    //**********************************************************************

            Console.Read();
        }  
    }



  • 相关阅读:
    Selenium简单测试页面加载速度的性能(Page loading performance)
    Selenium Page object Pattern usage
    Selenium如何支持测试Windows application
    UI Automation的两个成熟的框架(QTP 和Selenium)
    分享自己针对Automation做的两个成熟的框架(QTP 和Selenium)
    敏捷开发中的测试金字塔(转)
    Selenium 的基础框架类
    selenium2 run in Jenkins GUI testing not visible or browser not open but run in background浏览器后台运行不可见
    eclipse与SVN 结合(删除SVN中已经上传的问题)
    配置Jenkins的slave节点的详细步骤适合windows等其他平台
  • 原文地址:https://www.cnblogs.com/GeneralXU/p/1548398.html
Copyright © 2011-2022 走看看