c#反射使用
2015-07-22 18:14
806 查看
使用ORM也有几个项目了,是利用反射原理实现的。大概知道反射是什么东西,也知道反射的作用和原理,自己却没有使用过,不知道如何使用?我也是醉了。
创建一个类库,编译生成dll程序集
将程序集放到,需要反射项目的bin目录下,然后使用反射设置属性和使用方法
执行结果截图
创建一个类库,编译生成dll程序集
namespace ReflectionClass { public class Student { private string _name; private bool _isMonitor; public string Name { get { return _name; } set { _name = value; } } public bool IsMonitor { get { return _isMonitor; } set { _isMonitor = value; } } //无参构造函数 public Student() { Name = "Constructor"; IsMonitor = false; } //有参数的构造函数 public Student(string name, bool isMonitor) { _name = name; _isMonitor = isMonitor; } //无参数的方法 public string Hello() { if (_isMonitor) { return string.Format("Hello,My Name Is {0},Im Monitor", _name); } else { return string.Format("Hello,Im {0}", _name); } } } }
将程序集放到,需要反射项目的bin目录下,然后使用反射设置属性和使用方法
using System; using System.Reflection; namespace Reflection { class Program { static void Main(string[] args) { //获取程序集,LoadFile方法里面必须是物理路劲,Environment.CurrentDirectory返回的是bin\debug的绝对路径 Assembly assembly = Assembly.LoadFile(System.Environment.CurrentDirectory + "\\ReflectionClass.dll"); //获取Student类型 var type = assembly.GetType("ReflectionClass.Student"); object result = null; #region 调用构造函数 #region 无参构造函数 //创建Student实例 var student1 = assembly.CreateInstance("ReflectionClass.Student"); //调用无参数的构造函数 var constructorInfo = type.GetConstructor(new Type[0]); //这里可以不调用构造函数,因为实例化的时候已经默认调用了无参数的构造函数 if (constructorInfo != null) constructorInfo.Invoke(student1, null); result = type.GetMethod("Hello").Invoke(student1, null); Console.WriteLine(result); #endregion #region 有参数的构造函数 //创建Student实例 var student4 = assembly.CreateInstance("ReflectionClass.Student"); //调用有参数的构造函数,这里参数类型一定要和构造函数的参数对应,否者就会检索不到构造函数。如果检索不到,创建对象(实例化)的时候就会使用无参数的构造函数。 var constructorInfoPram = type.GetConstructor(new Type[2] {typeof (string), typeof (bool)}); //具体参数值写在Invoke的第二个参数里面new object[]{} if (constructorInfoPram != null) constructorInfoPram.Invoke(student4, new object[] {"xiaowang", true}); //调用的方法如果是无参数的,Invoke的第二个方法为null,如果是有参数的使用new object[]{}添加参数值 result = type.GetMethod("Hello").Invoke(student4, null); Console.WriteLine(result); #endregion #endregion #region 单个设置属性,调用方法,构造函数 //创建Student实例 var student2 = assembly.CreateInstance("ReflectionClass.Student"); //设置Name和IsMonitor属性 type.GetProperty("Name").SetValue(student2, "wangqi", null); type.GetProperty("IsMonitor").SetValue(student2, false, null); //调用Hello方法 result = type.GetMethod("Hello").Invoke(student2, null); Console.WriteLine(result); #endregion #region 遍历设置属性,调用方法 //创建Student实例 var student3 = assembly.CreateInstance("ReflectionClass.Student"); //获取所有属性,通过遍历设置属性值 PropertyInfo[] propertyInfos = type.GetProperties(); foreach (var info in propertyInfos) { switch (info.Name) { case "Name": info.SetValue(student3, "tangmeng", null); break; case "IsMonitor": info.SetValue(student3, true, null); break; } } //获取所有方法,通过遍历执行方法 MethodInfo[] methodInfos = type.GetMethods(); foreach (var methodInfo in methodInfos) { switch (methodInfo.Name) { case "Hello": result = methodInfo.Invoke(student3, null); break; } } Console.WriteLine(result); #endregion Console.ReadLine(); } } }
执行结果截图
相关文章推荐
- C#的语法结构
- C# 交叉数组和二维数组的简单区别
- 《C#高级编程(第六版)》泛型学习笔记(一):泛型优点和特性 (转载)
- C#从类序列化为xml文件,和从xml文件反序列化为类,XmlSerializer
- (转)C#彻底关闭窗体
- 《C#高级编程》之委托学习笔记 (转载)
- C#高级编程四十七天----集合接口和类型
- C#基础回顾:正则表达式
- Winform 获取相对路径 C#
- c#抽象工厂类
- C#设计模式纵横谈 笔记+原教程(很好很详细)
- C# 属性和字段 get set
- 大白话系列之C#委托与事件讲解(一)
- C# 创建EXCEL文件
- .Net学习笔记----2015-07-22(C#基础复习10,面向对象2个小练习)
- 编写高质量代码改善C#程序的157个建议——导航开篇
- C# 异常类 Exception 枚举所有类型的异常
- C#委托和事件的实例讲解
- C#+Socket客户端断线重连的解决办法
- C#操作IIS