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

    1.反射:反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中的每一个类型(包括类,结构,委托,接口和枚举)的成员和成员信息。

    2.特点:(1)减少代码量。(2)降低程序之间的耦合性,使框架更加合理。

    3.用途:

      (1)使用Assembly定义和加载程序集,加载在程序集清单中的列出模块,以及从此程序集中查找类型并创建该类型的实例。

      (2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。

      (3)使用ConstructorInfo了解构造函数的名称,参数,访问修饰符(如public或者private)和现实详细信息(abstract或者virtual)。

      (4)使用MethodInfo了解方法的名称,返回类型,参数,访问修饰符。

      (5)使用FieldInfo了解字段的名称,访问修饰符和现实详细信息。

      (6)使用EventInfo了解事件的名称,事件处理程序类型,自定义属性,声明类型和反射类型等,添加或移除事件处理程序。

      (7)使用PropertyInfo了解属性的名称,数据类型,声明类型,反射类型和只读或可写状态等,获取或设置属性值。

      (8)使用ParameterInfo了解参数的名称,数据类型,是输入参数还是输出参数,以及参数在方法签名的位置等。

    4.反射使用的命名空间

      (1)System.Reflection   (2)System.Type   (3)System.Reflection.Assembly

    5.获取给定类型的Type引用有3种常用方式

      (1)使用C#typeof运算符

        Type t = typeoff(string);

        (2)使用对象GetType()方法

        string s = "sfsffgr";

        (3)调用Type类的静态方法GetType()

        Type t = Type.GetType("System.String");

     6.获取类中所有公有字段的例子:

      
    namespace text
    {
        class Program 
        {
            static void Main(string[] args)
            {
                Type type = typeof(Person);
                //获取Person类中的公有字段
                FieldInfo[] fis = type.GetFields();
                foreach (var temp in fis)
                {
                    Console.WriteLine(temp);
                }
     
        //获取Person类中的公有属性
                PropertyInfo[] proInfo = type.GetProperties();
                foreach (var temp in proInfo)
                {
                    Console.WriteLine(temp);
                }
     
        //获取Person类中的构造函数
                ConstructorInfo[] conInfo = type.GetConstructors();
                foreach (var temp in conInfo)
                {
                    Console.WriteLine(temp);
                    //获取构造函数的所以参数
                    ParameterInfo[] parInfo = temp.GetParameters();
                    foreach (var item in parInfo)
                    {
                        Console.WriteLine(item);
                    }
                }
        
           //获取Person类中的所有方法
                MethodInfo[] methodInfo = type.GetMethods();
                foreach (var temp in methodInfo)
                {
                    Console.WriteLine(temp);
                }    
       
        //根据指定的参数列表获取对应的构造函数
                Type[] paramType = new Type[2];
                paramType[0] = typeof(string);
                paramType[1] = typeof(int);
                ConstructorInfo con = type.GetConstructor(paramType);
        Console.WriteLine(temp);
        
        //创建类的实例
                object[] obj = new object[] { "123", 123 };
                object person = con.Invoke(obj);
                ((Person)person).Show();
               
                Console.ReadKey();
            }
        }
        public class Person
        {
            public string str;
            public int num;
       public string Name { get; set; }
            public int Age { get; set; }
       public Person()
            {
                Console.WriteLine("No Parameter Consturctor");
            }
            public Person(string _str, int _num)
            {
                str = _str;
                num = _num;
                Console.WriteLine("Have Parameter Constur ctor");
            }
        }
    }
    View Code
    111
  • 相关阅读:
    转载: HashMap的工作原理
    什么web服务器、什么是应用服务器,常见的web服务器和应用服务器有哪些
    论文查重应对策略
    web测试方法总结
    软件测试中十大负面测试用例
    mysql 学习笔记
    Tomcat转jboss踩的那些坑
    实现简单的List功能
    java ScriptEngine 使用 (java运行脚本文件)
    rmi 工作原理
  • 原文地址:https://www.cnblogs.com/zwj-199306231519/p/11789504.html
Copyright © 2011-2022 走看看