C#反射机制

来源:互联网 发布:51talk怎么样 知乎 编辑:程序博客网 时间:2024/05/18 04:12

c#反射机制

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

1. Type 类 获取某个类型的详细信息的类,
- typeof Type t1=typeof(string);
- s.GetType() string s=”hello”; s.GetType();
- Type.GetType()参数是某个类型的完全限定名 Type t3=Type.GetType(“System.String”)
2. MemberInfo[]mi=t1.GetMembers();可以很明显的从GetMembers()看出,获取的是类中的所有成员,所以返回值类型一定是可以存储多个数据的类型。所以就是一个MemberIbfo类型的数组。数组中的成员包含,MemberType Name 等多个属性

        MemberInfo[] mis = t1.GetMembers();           foreach (var item in mis)          {                Console.WriteLine("Name{0}",item.Name);          }
  1. 获取构造函数
        ConstructorInfo[] cis = t.GetConstructors();         foreach (var item in cis) 获取的是所有的构造函数            {                Console.WriteLine(item);                // 获取构造函数的参数                foreach (var it in item.GetParameters())                {                    //输出构造函数的参数的类型                    Console.WriteLine(it.ParameterType);                }            }
  1. 用Type 类型的数组存储参数列表 和普通的数组一样,可以用多种方式初始化
 Type []ps = new Type [5];            ps[0] = typeof(string);            ps[1] = typeof(int);            ps[2] = typeof(double);            ps[3] = typeof(double);            ps[4] = typeof(double);ConstructorInfo ci = t.GetConstructor(ps);//根据ps表示的参数列表获取构造函数ParameterInfo[] pi = ci.GetParameters();获取构造函数中的参数信息 foreach (var item in pi)   {      Console.WriteLine(item.ParameterType+"    "+item.Name);   }//在写的时候要脑子里清楚是获取的什么东西,多个就用数组,单个就直接接收
  1. 定义参数列表 调用构造函数进行初始化
        object[] parmeters = { "zhangsan", 20, 78, 88, 98 };//            NewClass nc = (NewClass)ci.Invoke(parmeters);            //通过activator的CreateInstance 方法创建对象,            //第一个参数是对象的类型,后边的参数是构造函数的参数            //根据构造函数参数自动选择对应的构造函数  不写参数的话默认调用无参的构造函数            object o = Activator.CreateInstance(t, "zhangsan", 20, 89, 98, 88);            ((NewClass)o).print();            object o1 = Activator.CreateInstance(t);            ((NewClass)o1).print();      } 
  1. 创建对象
    object o = Activator.CreateInstance(t);//创建实例 o 就是一个实例对象,
    获取属性
    c#
    PropertyInfo pi_name=t.GetProperty("Name");
    PropertyInfo pi_age = t.GetProperty("Age");

    设置属性的值
    pi_name.SetValue(o, “ffffff”);//setValue
    获取属性的值
    Console.WriteLine(pi_age.GetValue(o))
  2. 需要添加程序集

        /*Assembly ass = Assembly.Load("library");       Type[] t = ass.GetTypes();//获取所有的类    //使用loadFrom或LoadFile时,不需要将程序集添加到工程中来       //可以直接通过文件的路径来加载程序集       //Loadfill不会添加程序集依赖的资源,只添加该程序及本身       //Loadfrom会添加程序集依赖的所有程序集
原创粉丝点击