zoukankan      html  css  js  c++  java
  • C#:反射

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    //注意添加该反射的命名空间 
    using System.Reflection; 
    
    namespace ReflectionProj
    {
        public class CReflection
        {
            //反射实例化对象并调用其方法,属性和事件的反射调用略去 
            public void UseReflection() 
            { 
                //加载程序集 
                Assembly tmpAss = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + @"......
    efDllsReflectionProj.dll"); 
      
                //遍历程序集内所有的类型,并实例化 
                Type[] tmpTypes = tmpAss.GetTypes(); 
                foreach (Type tmpType in tmpTypes) 
                {
                    if (tmpType.FullName == "ReflectionProj.CReflection") //防止死循环因为实在ReflectionProj工程内部调用自身的ReflectionProj.dll,一般都是在其他工程中
                    {
                        return;
                    }
    
                    //获取第一个类型的构造函数信息 
                    ConstructorInfo[] tmpConsInfos = tmpType.GetConstructors(); 
                    foreach (ConstructorInfo tmpConsInfo in tmpConsInfos) 
                    { 
                        //为构造函数生成调用的参数集合 
                        ParameterInfo[] tmpParamInfos = tmpConsInfo.GetParameters();  
                        object[] tmpParams = new object[tmpParamInfos.Length]; 
                        for (int i = 0; i < tmpParamInfos.Length; i++) 
                        { 
                            tmpParams[i] = tmpAss.CreateInstance(tmpParamInfos[i].ParameterType.FullName); 
                            if (tmpParamInfos[i].ParameterType.FullName == "System.String") 
                            { 
                                tmpParams[i] = "Clark"; 
                            } 
                        } 
      
                        //实例化对象 
                        object tmpObj = tmpConsInfo.Invoke(tmpParams); 
                        Console.WriteLine(tmpObj); 
      
                        //获取所有方法并执行 
                        foreach (MethodInfo tmpMethod in tmpType.GetMethods()) 
                        { 
                            //为方法的调用创建参数集合 
                            tmpParamInfos = tmpMethod.GetParameters(); 
                            tmpParams = new object[tmpParamInfos.Length]; 
                            for (int i = 0; i < tmpParamInfos.Length; i++) 
                            { 
                                tmpParams[i] = tmpAss.CreateInstance(tmpParamInfos[i].ParameterType.FullName); 
                                if (tmpParamInfos[i].ParameterType.FullName == "System.String") 
                                { 
                                    tmpParams[i] = "Clark Zheng"; 
                                } 
                                if (tmpParamInfos[i].ParameterType.FullName == "System.Int32") 
                                { 
                                    tmpParams[i] = 27; 
                                } 
                            } 
                            tmpMethod.Invoke(tmpObj, tmpParams); 
                        } 
      
                        //调用完方法后再次打印对象,比较结果 
                        Console.WriteLine(tmpObj); 
                    } 
                } 
      
                Console.ReadLine(); 
            } 
        }
    
        /*
         * 
         *25.什么是反射? 
    
            答: 
            
            反射,Reflection,通过它我们可以在运行时获得各种信息,如程序集、模块、类型、字段、属性、方法和事件 
            
            通过对类型动态实例化后,还可以对其执行操作 
            
            一般用于插件式框架程序和设计模式的实现,当然反射是一种手段可以充分发挥其能量来完成你想做的任何事情
            (前面好象见过一位高人用反射调用一个官方类库中未说明的函数。。。) 
     
         * 
         * 
         * 
         */
    }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ReflectionProj
    {
        public class CPerson
        {
            private string name; 
            private int age; 
      
            //如果显式的声明了无参数构造函数,客户端只需要用程序集的CreateInstance即可实例化该类 
            //在此特意不实现,以便在客户调用端体现构造函数的反射实现 
            //public CReflection() 
            //{ 
            //} 
            public CPerson(string Name, int Age) 
            { 
                name = Name; 
                age = Age; 
            } 
            public void ChangeName(string NewName) 
            { 
                name = NewName; 
            } 
            public void ChangeAge(int NewAge) 
            { 
                age = NewAge; 
            } 
            public override string ToString() 
            { 
                return string.Format("Name: {0}, Age: {1}", name, age); 
            } 
       
        }
    }
  • 相关阅读:
    iOS SQLite函数总结
    转-NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象
    NSUserDefaults保存用户名和密码
    iOS 集成银联支付(绕过文档的坑,快速集成)-转
    iOS微信支付
    iOS生成PDF的关键代码-备忘
    python中的urlencode和urldecode
    python中%r和%s的区别
    ubuntu16.04安装wps
    二进制、八进制、十进制、十六进制之间的转换
  • 原文地址:https://www.cnblogs.com/shenchao/p/4223184.html
Copyright © 2011-2022 走看看