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. Effective C++ 读书笔记(1-7)

    作者 Scott Meyers  翻译作者 侯捷 C++ 神牛 台湾人 术语: 1.explicit C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生.声明 ...

  2. 函数上下文this

    一般来说谁调用上下文都指向谁,具体有以下几种情况: 1.函数用圆括号调用,函数的上下文是window 注意:所有的全局变量都是window的属性,而函数里边定义的变量谁的属性也不是. 2.函数作为对象 ...

  3. 一文读懂 Spring Boot、微服务架构和大数据治理三者之间的故事

    微服务架构 微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物.互联网时代的产品通常有两类特点:需求变化快和用户群体庞大,在这种情况 ...

  4. Linux内核调试方法

    内核配置选项中要使能CONFIG_MAGIC_SYSRQ选项,这样系统启动之后,会生成/proc/sysrq-trigger节点用于调试. 其次,可以在/etc/sysctl.conf中设置kerne ...

  5. MyBatis xml配置文件详解

    http://blog.csdn.net/fenghuibian/article/details/52525671

  6. 修改eclipse的workspace目录

    打开Window,选择Preferences->General-->Startup and Shutdown->Workspaces,勾选Prompt for workspace o ...

  7. SpringCloud实战-Zuul网关服务

    为什么需要网关呢? 我们知道我们要进入一个服务本身,很明显我们没有特别好的办法,直接输入IP地址+端口号,我们知道这样的做法很糟糕的,这样的做法大有问题,首先暴露了我们实体机器的IP地址,别人一看你的 ...

  8. JavaScript单线程和异步机制

    随着对JavaScript学习的深入和实践经验的积累,一些原理和底层的东西也开始逐渐了解.早先也看过一些关于js单线程和事件循环的文章,不过当时看的似懂非懂,只留了一个大概的印象:浏览器中的js程序时 ...

  9. Android 增强版百分比布局库 为了适配而扩展

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/46767825: 本文出自:[张鸿洋的博客] 一 概述 上周一我们发布了Andr ...

  10. statsd.go

        }     return arr[indexOfPerc] }