首页 > 编程语言 >c#代码的执行过程及反射的应用

c#代码的执行过程及反射的应用

时间:2023-06-18 13:03:48浏览次数:52  
标签:反射 Assembly string c# 代码 dll new type

1.反射是什么?
是微软提高的一个类包,访问dll里面的metadata,IL

2.为什么要用反射?
程序可配置和可以突破方法的权限限制

3.反射调用方法?反射创建对象?

Assembly assembly = Assembly.LoadFrom("xxx.dll"); //dll名称(需要后缀)  
Type type = assembly.GetType("aaa.ReflectionTest");
object obj =Activator.CreateInstance(type)
MethodInfo show =type.GetMethod("show1",new Type[]{"string",123});
show.Inoke(obj, new object[] { "11" });

4.通过反射操作类的属性,字段,方法?设置值和获取值

Type type = typeof(People);
object oPeople =Activator.CreateInstance(type)
foreach (FieldInfo field in type.GetFields()) //获取所有的字段
                            {
                               if (field.Name.Equals("Description"))
                                {
                                field.SetValue(oPeople, "aaa");
                                }
                                Console.WriteLine(field.Name);
                             } foreach (PropertyInfo prop in type.GetProperties())
                            { 
                                 Console.WriteLine(prop.GetValue(oPeople));
                            } 
foreach (FieldInfo field in type.GetFields()) //获取所有的字段
                            {
                                Console.WriteLine(field.GetValue(oPeople));
                            }

5.反射在框架中的应用,反射封装ORM的应用?

public T Find<T>(int id) where T:class
{
   Type type=Typeof(T);
   var pro=type.GetProperties().Select(p=>$"[{p.Name}]");
   string pros=string.Join(",",pro);
   string sql=$"select {pros} from [{type.Name}] where id={id}";
  string strConn="";
object oResult = Activator.CreateInstance(type);
  using (SqlConnection connection = new SqlConnection(strConn))
            {
                using (SqlCommand command = new SqlCommand(sql, connection))
                {
                    connection.Open();
                    SqlDataReader reader = command.ExecuteReader();
                    if (reader.Read())
                    {
                        foreach (PropertyInfo prop in type.GetProperties())
                        {
                            prop.SetValue(oResult, reader[prop.Name]);
                        }
                    }
                }
            }
            return (T)oResult;
}

--------------------------

0.c#代码的执行过程:
c#(编译器)-->dll/exe(metadata/IL)-->CLR/JIT-->机器码()01010101

1. appsettings.json配置文件配置要访问的类和dll
"ReflictionConfig": "aaa.MySqlHelper,sss.dll"

2.代码读取dll,实例化一个配置类的对象

public static IDBHelper CreateInstance()
        {
            string ReflictionConfig = CustomConfigManager.GetConfig("ReflictionConfig");
            string tyepName= ReflictionConfig.Split(",")[0];
            string dllName = ReflictionConfig.Split(",")[1];            //Assembly assembly = Assembly.Load(dllName); //Dll名称,不需要后缀 
            Assembly assembly3 = Assembly.LoadFrom(dllName); //dll名称(需要后缀) 

            Type type = assembly3.GetType(tyepName); 
            object obj = Activator.CreateInstance(type);  
            return obj as IDBHelper;
        }

3. 反射可以突破方法的权限限制
100_000_000

4. 反射性能并不会消耗多大,100万次循环和普通方法相差3倍的时间,

单例模式=是一种常见类的写法,

public class SingletonA
 {
  //私有成员,使用时分配内存
  private static SingletonA _instance = null;
  //私有构造,杜绝直接new类
  private SingletonA() { }  //获取实例
  public static SingletonA GetInstance ()
  {    if (_instance == null)
   {
    _instance = new SingletonA();
   }
   return _instance;
  }
 }

 

-----------------------

Emit 是反射的一种;
懒加载=延迟加载执行;
ORM表达式目录树;
实体生成器创建类=创建文件



标签:反射,Assembly,string,c#,代码,dll,new,type
From: https://blog.51cto.com/u_15310950/6508225

相关文章

  • 通用mapping实现的SSM项目:SSM 框架:是 Spring + Spring MVC + MyBatis
    1.结合通用mapping实现的SSM项目:SSM框架:是Spring+SpringMVC+MyBatis的缩写mybatisgenerator:配置插件通用mapper:tk.mybatis2.MyBatis逆向工程组件是MyBatisGenerator,简称MBG,是专为MyBatis框架制定代码自动生成解决方案,MBG可以根据数据表结构快速生成对应的实体类、......
  • 微服务配置中心选型比较——Nacos、Apollo
    创建配置中⼼,将配置从各个应⽤中剥离出来,对配置进⾏统⼀管理,应⽤⾃身不需要⾃⼰去管理配置.1.概述随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关、参数的配置、服务器的地址……对程序配置的期望值也越来越高:配置修改后实时生效,分环境、分集群管理配置,代码安全、审核机......
  • 镜像,容器,容器数据卷,DockerFile 相关命令 使用总结
    镜像,容器,容器数据卷,DockerFile相关命令使用总结镜像是1种轻量级、可执行的独立的软件包。包含:代码,运行时,库,环境变量和配置文件。所有软件包,直接打包docker镜像,就可以直接跑起来.独立的运行环境。一.镜像命令1.列出本机所有镜像,查看镜像dockerimages2.搜索镜像dockersearc......
  • nginx-clojure 0.6.0 的一些新特性
    昨天制作了0.6.0的docker镜像,并说明了一些问题,以下简单说明下一些新特性新特性所有的handler可以在http以及servercontext使用了,可以方便进行组合使用nginx1.23.x支持jdk19支持,支持协程了官方提供的二进制构建基于1.23.3说明昨天也说明了,官方提供的二进制包缺少一些依赖,......
  • coredb 使用pg all-in-one 解决方案
    coredb认为可以使用pg干任何事情,自己基于rust开发了不少pg的扩展,当然也包含了不少社区现有的扩展同时coredb还开发了一个pg扩展仓库(实际上以前社区也有一个)说明目前coredb还在开发中,核心技术栈基于了rust,一些理念还是值得学习参考的参考资料https://docs.coredb.io/https://......
  • nginx-clojure 源码构建一些问题
    因为nginx-clojure就是一个标准的nginx模块,一些是尝试基于源码进行构建发现一些问题的说明简单说明nginx当前1.25版本的构建是有问题的,1.24版本构建是可以的,1.23版本实际上官方已经提供了但是如果查看nginx官方文档会发现1.23版本的下载官方是似乎移除了,没直接提供了......
  • lilo java 快速 graphql stitching 包
    lilo是一个快速的graphqlstitching包,可以实现合并多个graphql服务的合并(schema,以及调用)比较适合的业务场景是gateway说明同时在springone官方中也有介绍到,内部使用到了graphql-java进行处理参考资料https://github.com/friatech/lilohttps://bitbucket.org/atlassian/graphql......
  • nginx-clojure-0.6.0 集成nginx 1.25.0 构建的解决方法
    今天也说过关于nginx-clojure-0.6.0集成nginx1.2.50构建是有问题的,以下是解决方法实际问题staticdeclarationof‘ngx_http_close_request’followsnon-staticdeclaration原因nginx-clojure复制了nginx源码中对于nginx的处理函数(ngx_http_clojure_mem.c文件)/*copyfrom......
  • go语言tcp编程学习
    TCP编程1、网络编程分类包括TCPsocket编程(底层基于tcp/ip协议)和b/s结构的http编程(使用的是http协议,但是底层是tcpsocket实现的)资料:尚硅谷的TCP资料(3卷),可以咸鱼找下资料看下2TCPsocket编程windows查看端口密码:netstat-anb;netstat-an服务器端的处理流程监听端口;接受......
  • SpringBoot项目报错解决:“Error starting ApplicationContext. To display the condit
    SpringBoot项目报错:ErrorstartingApplicationContext.Todisplaytheconditionsreportre-runyourapplicationwith'debug'enabled.以下方案80%可以帮助您解决这些个‘可恶的’问题目录一、编译出问题二、代码格式导致的编译出问题三、请求接口重复四、......