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表达式目录树;
实体生成器创建类=创建文件

posted @ 2021-10-15 22:04  大树2  阅读(235)  评论(0编辑  收藏  举报