Why?为什么使用反射
MVC ORM EF 都是用的反射。反射可以让程序的扩展性,灵活性得到加强。一起即可动态创建
 
what 反射原理
   动态加载类库 ,先添加引用类库,或者复制debug里面的文件dll到运行文件Debug
Assembly assembly = Assembly.Load("WeiAi.DB.MysqlHelper");//反射生成类库 使用Assembly ,Load方法 里面填写namespace
    foreach (var item in assembly.GetModules()) //遍历类库的dll文件
    {
        Console.WriteLine(item.Name);
    }

foreach (var item in assembly.GetTypes())//遍历类库的类型
    {
        Console.WriteLine(item.Name);
             foreach (var act in item.GetMethods())//遍历类的方法
            {
                Console.WriteLine(act.Name);
             }

     }

 
反射创建对象并调用方法
Assembly assembly = Assembly.Load("WeiAi.DB.MysqlHelper"); //反射类库
 
Type type = assembly .GetType("WeiAi.DB.MysqlHelper.MySQLHelper");//反射类型
 
object obj = Activator.CreateInstance(type,null);//动态创建类的对象
 
ISQLHelper mysql = oMysql as ISQLHelper;// ISQLHelper 是创建的一个接口,MysqlHelper实现了这个接口,所以它类的对象可以转换
 
mysql.Query();//调用方法
 
 
创建不同的对象:
1、无参对象:
object obj = Activator.CreateInstance(type,null);
2、有参对象 int参数为例:
object obj = Activator.CreateInstance(type,new object[]{11});
3、创建泛型对象
Type genericType = assembly.CreateInstance("WeiAi.DB.MysqlHelper.GenericClass`3");//GenericClass为泛型类 有3个泛型,就写数字3
Type ty1 =genericType.MakeGenericType(new Type[]{typeof{int},typeof{string},typeof{int}});
object obj =Activator.CreateInstance(ty1,new object[]{11,"hello",123});//三个有参构造函数
object obj =Activator.CreateInstance(ty1,null);//无参构造函数
 
调用不同的方法:
{
    object ob1 = Activator.CreateInstance(myType);
    MethodInfo method = myType.GetMethod("Show1");//无参方法
    method.Invoke(ob1, null);
}
{
    object ob1 = Activator.CreateInstance(myType);
    MethodInfo method = myType.GetMethod("Show2", new Type[] { typeof(int) });//有一个参方法
    method.Invoke(ob1, new object[] { 12 });
}
{
    object ob1 = Activator.CreateInstance(myType);
    MethodInfo method = myType.GetMethod("Show3", new Type[] { typeof(int), typeof(string) });//有两个参方法
    method.Invoke(ob1, new object[] { 12, "haha" });
}
{
//Type myType1 = assembly.GetType("WeiAi.DB.MysqlHelper.GenericMethod");
//object ob1 = Activator.CreateInstance(myType1);
//MethodInfo method = myType1.GetMethod("Show");
//MethodInfo methodNew= method.MakeGenericMethod(new Type[] { typeof(int),typeof(string),typeof(double) });
//methodNew.Invoke(ob1,new object[] { 12,"Jianghao",123456});

object ob1 = Activator.CreateInstance(myType);
    MethodInfo method = myType.GetMethod("Show4");
    MethodInfo methodNew = method.MakeGenericMethod(new Type[] { typeof(int) });//泛型方法
    methodNew.Invoke(ob1, new object[] { 123123123 });
}

{
    object ob1 = Activator.CreateInstance(myType);
    MethodInfo method = myType.GetMethod("Show5");//静态方法
    method.Invoke(null, null);
}

{
    object ob1 = Activator.CreateInstance(myType);
    MethodInfo method = myType.GetMethod("Show6");//带返回值的方法
    object result = method.Invoke(ob1, null);
    Console.WriteLine(result);
}

 
 
反射类的属性和字段,并且动态赋值或者获取值
Type type = typeof(Person);
Person oPerson = (Person)Activator.CreateInstance(type);
oPerson.Id = 123;
oPerson.Name = "hai";
oPerson.Age = 18;
oPerson.Description = "1111111111111111";
// Person person = new Person();
foreach (var item in type.GetProperties())//属性
{
Console.WriteLine(item.Name);
Console.WriteLine(item.GetValue(oPerson));
if (item.Name.Equals("Id"))
{
item.SetValue(oPerson, 12);
}
if (item.Name.Equals("Name"))
{
item.SetValue(oPerson, "jianghao");
}
if (item.Name.Equals("Age"))
{
item.SetValue(oPerson, 22);
}
if (item.Name.Equals("Description"))
{
item.SetValue(oPerson, "hahahahaha");
}
Console.WriteLine(item.GetValue(oPerson));
}

foreach (var item in type.GetFields())//字段
{
Console.WriteLine(item.Name);
}

.Net 反射学习的更多相关文章

  1. Java 反射学习笔记

    要学反射,先要了解Class这个类,Class是所有Java类的一个总称,Class的实例中存储的是一个类的字节码,获取Class的实例有三种方式: System.class new Date().g ...

  2. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  3. Java反射学习:深入学习Java反射机制

    一.Java反射的理解(反射是研究框架的基础之一) Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的 ...

  4. iOS 反射 学习 和 运用

    iOS  反射 学习 和 运用 反射:  通过 类名来获得生成的相应的类的实例 的这种机制  叫 反射 常用的反射方式 把 NSDictionary  转成 自定义 model 自定义 model 转 ...

  5. Java反射学习系列-绪论

    Java反射学习系列-绪论 https://blog.csdn.net/hanchao5272/article/details/79358924

  6. Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 本文是Java反射学习总结系列的最后一篇了,这里贴出之前文章的链接,有兴趣的可以打开看看. ...

  7. Java反射学习总结四(动态代理使用实例和内部原理解析)

    通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加 ...

  8. Java高级特性之反射学习总结

    老规矩我们还是先提出几个问题,一门技术必然要能解决一定的问题,才有去学习掌握它的价值 一. 什么是反射? 二.反射能做什么? 一. 什么是反射? 用在Java身上指的是我们可以于运行时加载.探知.使用 ...

  9. java学习——java中的反射学习笔记

    Java--reflect 一.Class类的使用 什么是Class类? 1:在面向对象的世界中,万事万物皆对象. java语言中,静态的成员,普通数据类型类是不是对象呢? 是,对象!是类的对象! 类 ...

  10. Java反射学习总结

    我开始学习反射的初衷是为了理解Spring 里的控制反转,其次可以利用反射来达到类中的解耦. 自己写的一些心得,希望能帮到大家 1.反射指的是对象的反向处理操作,是根据对象来取得对象的来源信息. 反射 ...

随机推荐

  1. Spring系列(三):Spring IoC中各个注解的理解和使用

    原文链接:1. http://www.cnblogs.com/xdp-gacl/p/3495887.html       2. http://www.cnblogs.com/xiaoxi/p/5935 ...

  2. 浅谈Java多线程的同步问题 【转】

    多线程的同步依靠的是对象锁机制,synchronized关键字的背后就是利用了封锁来实现对共享资源的互斥访问. 下面以一个简单的实例来进行对比分析.实例要完成的工作非常简单,就是创建10个线程,每个线 ...

  3. Map Reduce和流处理

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由@从流域到海域翻译,发表于腾讯云+社区 map()和reduce()是在集群式设备上用来做大规模数据处理的方法,用户定义一个特定的映射 ...

  4. C++程序内存布局

      代码区(code area) 程序内存空间 全局数据区(data area) 堆区(heap area) 栈区(stack area) 一个由C/C++编译的程序占用的内存分为以下几个部分, 1) ...

  5. @component @bean区别

    from: http://stackoverflow.com/questions/10604298/spring-component-versus-bean http://stackoverflow. ...

  6. FMDB的简单实用

    一.FMDB 的框架引入点击此处去GitHub下载 二.FMDB 的优缺点 优点:使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码:对比苹果自带的Core Data框架,更加轻量级和灵活:提供了 ...

  7. mysql各种引擎对比、实战

    1)存储引擎概述: (2)MySQL各大存储引擎: (3)InnoDB和MyIsam使用及其原理对比: (4)InnoDB和MyIsam引擎原理: (5)剩余引擎的使用DEMO(主要是Mrg_Myis ...

  8. C#中DataGridView 对XML文档的使用

    窗体就只用添加一个DataGridView控件就可以了.详细解释请参照上一篇中的借鉴曲终人散博客园的文档. XML文档代码如下:test.xml <?xml version="1.0& ...

  9. screen,client,page三种确定鼠标坐标的区别和原生JS事件写法,区别于Jquery的$.on(x,y);和$.click()

    screenX clientX pageX的区别 screenX:鼠标位置相对于用户屏幕水平偏移量,而screenY也就是垂直方向的,此时的参照点也就是原点是屏幕的左上角. clientX:跟scre ...

  10. 2. 引入springmvc

    springboot提供了spring-web-starter-web为web开发提供了支持,并且内嵌了tomcat及spring mvc的依赖,而且通过spring-boot-autoconfigu ...