c#代码的执行过程及反射的应用
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表达式目录树;
实体生成器创建类=创建文件
相关文章
- C#Light for Unity 新例子
- C#WinForm中支持透明的TextBox控件
- When should the volatile keyword be used in C#?
- C# Language Specification
- C#订阅与发布标准实现 visual studio code .net 开发 设计模式之☞策略模式 C#字符串转二进制、二进制转字符串 c# 接口的协变和逆变 c# 使用迭代器来创建可枚举类型 博客园首页新随笔联系订阅管理 随笔 - 117 文章 - 0 评论 - 57 c# 创建,加载,修改XML文档
- 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程
- C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
- 请求大神,C#如何截取字符串中指定字符之间的部分 按指定字符串分割 一分为二 c# 去除字符串中的某个已知字符
- C#语法——泛型的多种应用 C#语法——await与async的正确打开方式 C#线程安全使用(五) C#语法——元组类型 好好耕耘 redis和memcached的区别
- ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借
- C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
- 装饰者模式的学习(c#) EF SaveChanges() 报错(转载) C# 四舍五入 保留两位小数(转载) DataGridView样式生成器使用说明 MSSQL如何将查询结果拼接成字符串 快递查询 C# 通过smtp直接发送邮件 C# 带参访问接口,WebClient方式 C# 发送手机短信 文件 日志 写入 与读取
- 如何在C#项目中使用NHibernate
- 【C#】编写自定义特性与其应用
- C# 实现 ICMP PING 功能
- c#中使用NetCDF存储二维数据的读写操作简单应用
- C#,基于视频的目标识别算法(Moving Object Detection)的原理、挑战及其应用
- C#,基于密度的噪声应用空间聚类算法(DBSCAN Algorithm)源代码
- C#,单向链表(Simply Linked List)的归并排序(Merge Sort)算法与源代码
- C#,入门教程(11)——枚举(Enum)的基础知识和高级应用
- C#中System.Timers.Timer定时器的使用和定时自动清理内存的应用
- 谈C#对象复制
- c#中mysql远程连接方法及实例
- C# 发起拖放
- C#使用Sockets操作FTP【转载】
- 《C#零基础入门之百识百例》(五十四)派生类的介绍和使用 -- 等差数列
- C#-中IO的应用
- C#怎么给新建的winform程序添加资源文件夹Resources
- C# winform 窗体弹出选择目录或文件 的对话框
- c#中怎样判断一个程序是否正在运行?
- C# 多线程 弹出模态MessageBox的一种方法
- C# Linq简介