c#---反射

反射的常用类:
->Type类:设计用来包含类型的特性,可以获取程序中使用的类型信息。(获取一个类包含的成员和方法)。
Type类可以根据实例获取类的名称、所属命名空间、是否为公共类、以及类的字段、属性、方法等信息;

public void Test1()
{
	Car _car = new Car();
	Type typeCat = _car.GetType();//获取当前实例的类型
	typeCat.Name;//获取类的名称
	typeCat.NameSpace;//获取类所属命名空间
	typeCat.Assemnly;//获取所属程序集
	FieldInfo[] fileArray = typeCat.GetFields();//获取字段信息
	foreach (FieldInfo item in fileArray) {
            Console.WriteLine(item.Name);
    }
	MethodInfo[] methodInfos = typePerson.GetMethods();//获取方法信息
	foreach (MethodInfo item in methodInfos) {
			Console.WriteLine(item.Name);  
    }
	PropertyInfo[] propertyInfos = typePerson.GetProperties();//获取属性信息
	foreach (PropertyInfo item in propertyInfos) {
            Console.WriteLine(item.Name);
    }
}

->Assembly类:得到一个程序集中反射信息。
程序集存在形式:.dll文件、.exe文件
加载程序集:

Assembly assembly =Assembly.LoadFrom(@"D:\Cu111_cv440_dnn821\emgu4.4.0\Emgu.CV.dll");
Type[] ty = assembly.GetTypes();//获取程序集中所有的类
foreach (Type item in ty) {
             Console.WriteLine(item.Name);
            }

->使用反射来动态调用
1)无参方法的调用

 //通过反射,调用无参的方法
    public void Test4()
    {
        string className = "Person";//类名称字符串
        string methodName = "DisplayAge";//方法名称字符串
        //获取程序集类型
        Assembly assembly = Assembly.LoadFrom(@"E:\反射.exe");
        //获取type 类
        Type typeclass = assembly.GetType("反射." + className);//通过类名字符串获取**类型声明**
        object obj = Activator.CreateInstance(typeclass);//根据类型声明创建类的对象
        //根据方法名称获取该对象中的方法
        MethodInfo methodInfo = typeclass.GetMethod(methodName);
        //调用无参方法
        methodInfo.Invoke(obj, null);
        Console.ReadLine();
    }

2)有参方法的调用

 		//通过反射,调用有参方法
        public void Test5()
        {
            string className = "Person";//类名称字符串
            string methodName = "DisplayAge";//方法名称字符串
            //获取程序集
            Assembly assembly = Assembly.LoadFrom(@"E:\反射.exe");
            //获取type 类
            Type typeclass = assembly.GetType("反射." + className);//通过类名字符串获取类型声明
            object obj = Activator.CreateInstance(typeclass);//根据类型声明创建类的对象
            //根据方法名称获取该对象中的方法
            MethodInfo methodInfo = typeclass.GetMethod(methodName);
            object[] objPara = new object[1];
            objPara[0] = 23;//参数
            //调用有参方法
            methodInfo.Invoke(obj, objPara);
            Console.ReadLine();
        }

3)有参方法的调用–重载

		//通过反射,调用有参方法--重载
        public void Test6()
        {
            string className = "Person";//类名称字符串
            string methodName = "DisplayAge";//方法名称字符串
            //获取程序集
            Assembly assembly = Assembly.LoadFrom(@"E:\反射.exe");
            //获取type 类
            Type typeclass = assembly.GetType("反射." + className);//通过类名字符串获取类型声明
            object obj = Activator.CreateInstance(typeclass);//根据类型声明创建类的对象
            Type[] types = { typeof(int) };//提供重载的函数其参数类型
            //根据方法名称获取对象中的方法
            MethodInfo methodInfo = typeclass.GetMethod(methodName,types);
            object[] objPara = new object[1];
            objPara[0] = 1000;//参数
            //调用有参方法
            methodInfo.Invoke(obj, objPara);
            Console.ReadLine();
        }

4)私有方法的调用

		//通过反射,调用私有方法
        public void Test7()
        {
            string className = "Person";//类名称字符串
            string methodName = "DisplayPrivate";//方法名称字符串
            //获取程序集
            Assembly assembly = Assembly.LoadFrom(@"E:\反射.exe");
            //获取type 类
            Type typeclass = assembly.GetType("反射." + className);//通过类名字符串获取类型声明
            object obj = Activator.CreateInstance(typeclass);//根据类型声明创建类的对象
            //根据方法名称获取该对象中的私有方法
            MethodInfo methodInfo = typeclass.GetMethod(methodName, BindingFlags.NonPublic | 			  BindingFlags.Instance);
            
            //调用私有方法
            methodInfo.Invoke(obj, null);
            Console.ReadLine();
        }

5)属性调用

 		//通过反射,调用属性
        public void Test8()
        {
            string className = "Person";//类名称字符串
            string proName = "Name";//方法名称字符串
            //获取程序集
            Assembly assembly = Assembly.LoadFrom(@"E:\反射.exe");
            //获取type 类
            Type typeclass = assembly.GetType("反射." + className);//通过类名字符串获取类型声明
            object obj = Activator.CreateInstance(typeclass);//根据类型声明创建类的对象
            //获取属性
            PropertyInfo propertyInfo =  typeclass.GetProperty(proName);
            //给属性赋值
            propertyInfo.SetValue(obj, "zhang");
            //获取属性值
            string str = propertyInfo.GetValue(obj, null).ToString();
            Console.WriteLine(str);
            Console.ReadLine();
        }

->Type类深入方法

bool IsAssignableFrom(Type c);//判断段一个类/接口,是否是另一个类的父类或者接口
bool IsInstanceOfType(Object obj);//判断一个类是否是当前类的实例,或者实现接口
bool IsSubclassOf(Type c);//判断当前类是否是(参数)类的子类
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值