C#反射机制

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会添加程序集依赖的所有程序集
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值