安 网站建设青岛建站费用
- 作者: 五速梦信息网
- 时间: 2026年03月21日 10:01
当前位置: 首页 > news >正文
安 网站建设,青岛建站费用,浙江网站建设推广公司找哪家,平面设计与网页设计目录
C#学习
.NET的体系结构
二次编译
反射
什么是反射#xff1f;
什么是Type#xff1f;
什么是程序集#xff1f;
反射API#xff1a;
一#xff0c;程序集
1#xff0c; Load
2#xff0c;LoadFrom
3#xff0c;LoadFile
二#xff0c;类型实例
1
什么是Type
什么是程序集
反射API
一程序集
1 Load
2LoadFrom
3LoadFile
二类型实例
1无参构造
2有参构造
3私有构造
4泛型类
三方法调用
1普通方法
2静态方法
3私有方法
4泛型方法
5应用
四属性与字段
1属性读写
2字段读写
3应用
反射优缺点
优点
缺点
反射的价值是什么 C#学习
定义面向对象面向组件类型安全可以使用C#生成在.NET上运行的应用程序。
C#提供了语言构造来支持以上的定义所以可以用来创建和使用软件组件。
.NET的体系结构
C#在.NET上运行.NET叫做公共语言进行时CLR的虚拟执行系统和一组类库.CLR 是 Microsoft 对公共语言基础结构 (CLI) 国际标准的实现。 CLI 是创建执行和开发环境的基础语言和库可以在其中无缝地协同工作。
用 C# 编写的源代码被编译成符合 CLI 规范的中间语言 (IL)。 IL 代码和资源如位图和字符串存储在扩展名通常为 .dll 的程序集中。 程序集包含一个介绍程序集的类型、版本和区域性的清单metadata。
执行 C# 程序时程序集将加载到 CLR。 CLR 会直接执行实时编译将 IL 代码转换成本机指令。 CLR 可提供其他与自动垃圾回收、异常处理和资源管理相关的服务。
二次编译
目的一次编译多平台使用加一层中间层更加灵活
由于系统很多MacWinLinux其中Win还有32和64位的为了做到一次编译多平台运行就需要二次编译C#源代码被编译成中间语言存储在扩展名通常为 .dll 的程序集中 程序集包含一个介绍程序集的类型、版本和区域性的清单metadata。
这样在不同的平台同一份编译的中间语言通过 CLR 转换为不同平台可执行机器指令在不同平台执行。
反射
什么是反射
程序是用来处理数据的但是程序本身也是由数据组成的有关程序及其类型的数据元数据Metadata保存在程序集之中程序在运行中可以查看其他的程序集和自身的Metadata一个运行的程序查看本身的元数据或其他程序集的元数据的行为称为反射。
什么是Type
对于程序的类型CLR都会创建一个包含这个类型的Type对象程序中每遇到一个类型都会关联到独立的Type的对象不管创建的类有多少实例只有一个Type类的对象会关联到这些所有的实例。
什么是程序集
程序集是一个可以寄宿于 CLR 中的、拥有版本号的、自解释、可配置的二进制文件程序集的扩展名为 exe 或 dll。程序集是存放类型的集合通过程序集可以获取程序集内所有的类型信息
反射API
一程序集
如果没有加载依赖调用到使用依赖的对象时就会报错。
1 Load
XXXdll 名称无后缀 从当前目录加载 dll。开发环境 Bin 发布程序是入口程序集文件当前目录。
Assembly assembly Assembly.Load(XXXX);
2LoadFrom
XXX已知程序集的文件名和路径会自动加载程序集的依赖程序集。
Assembly assembly Assembly.LoadFrom(XXXX);
3LoadFile
XXX完整的dll路径加载不会出错不会加载目标程序集所引用和依赖的其他程序集需要自己控制并显示加载所有依赖的程序集如果没有依赖项使用的时候会错。
Assembly assembly Assembly.LoadFile(XXXX);
二类型实例
1无参构造
在获取Assembly后获取Type根据Type创建实例是Object类型的为了编译器可以通过需要进行类型转换。
Type type assembly.GetType(XXX.XXX);
object obj (XXX)Activator.CreateInstance(type);
2有参构造
在创建实例的时候需要通过new object[]参数进行重载此方法会根据 new object[] 里面的类型自动进行匹配构造函数
object obj (XXX)Activator.CreateInstance(type, new object[] { 124, 123 });
3私有构造
单例模式在代码里面为了避免外面进行实例化在实现时都是以 private 修饰符对构造函数进行修饰使其无法在外部进行实例化进行调用但反射可以破坏这个规则。重点在 CreateInstance 方法第二个参数 true
Assembly assembly Assembly.LoadFrom(XXXX);
Type type assembly.GetType(XXX.XXX);
object obj Activator.CreateInstance(type,true);
4泛型类
~n个占位符就代表几个泛型MakeGenericType 定义泛型类型传入 Type 数组即可
Assembly assembly Assembly.LoadFrom(XXXX);
Type type assembly.GetType(XXX~n);
Type typeNew type.MakeGenericType(new Type[] { typeof(int), typeof(XXX),typeof(string) });
object obj Activator.CreateInstance(typeNew, new object[] { 124, 123 });
三方法调用
1普通方法
Assembly assembly Assembly.Load(XXX);// dll
Type type assembly.GetType(XXX);// 类型名称
object instance Activator.CreateInstance(type); // 根据 type 实例对象
MethodInfo method type.GetMethod(XXX);// 方法名称
method.Invoke(instance,new object[] { 方法参数1, 方法参数2 });
2静态方法
静态成员Invoke 无需传入实例对象因为静态成员在类里面只有一份确定了 Type 后就已经有了其静态成员。
Assembly assembly Assembly.Load(XXX);// dll
Type type assembly.GetType(XXX);// 类型名称
MethodInfo method type.GetMethod(XXX);// 方法名称
method.Invoke(null,new object[] { 方法参数1, 方法参数2 });
3私有方法
私有方法在面向对象编程语言是不可以被外部调用的但反射可以破坏这个规则调用私有方法重点在 GetMethod 方法第二个参数为 BindingFlags.Instance|BindingFlags.NonPublic。
Assembly assembly Assembly.Load(XXX);// dll
Type type assembly.GetType(XXX);// 类型名称
object instance Activator.CreateInstance(type); // 根据 type 实例对象
MethodInfo method type.GetMethod(XXX,BindingFlags.Instance|BindingFlags.NonPublic);// 方法名称
method.Invoke(instance, new object[] { 方法参数1, 方法参数2 });
4泛型方法
无论是泛型类还是泛型方法都需要通过 MakeGenericXXXX 方法指定泛型的类型需要注意的是泛型类在加载类型时需要占位符而泛型方法不需要。
Assembly assembly Assembly.Load(XXX);// dll
Type type assembly.GetType(XXX~2);// 类型名称,~2 占位符代表几个泛型
Type typeNew type.MakeGenericType(new Type[] { typeof(string), typeof(int) });
object instance Activator.CreateInstance(typeNew); // 根据 type 实例对象
MethodInfo method type.GetMethod(XXX);// 方法名称
MethodInfo methodNew method.MakeGenericMethod(new Type[] { typeof(int) });
methodNew.Invoke(instance, new object[] { 方法参数1, 方法参数2 });
5应用
MVC就是使用的反射机制在程序启动时会扫描 controller 类型的类会将其 Type 缓存起来当有请求过来时就会到缓存中找到对于的 Type 反射进行实例化并调用其方法也就是 action。说到这 mvc 的 filter 也就是在 调用方法前后加点料反射 invoke 方法前后。
四属性与字段
1属性读写
Assembly assembly Assembly.Load(XXX);// dll
Type type assembly.GetType(XXX.XXX);// 类型名称
object instance Activator.CreateInstance(type); //实例对象
foreach (var prop in type.GetProperties())
{if (prop.Name.Equals(Id)){prop.SetValue(instance, 1);Console.WriteLine(prop.GetValue(instance));}else if (prop.Name.Equals(Name)){prop.SetValue(instance, 张三);Console.WriteLine(prop.GetValue(instance));}
}
2字段读写
Assembly assembly Assembly.Load(XXX);// dll
Type type assembly.GetType(XXX.XXX);// 类型名称
object instance Activator.CreateInstance(type); //实例对象
foreach (var field in type.GetFields())
{if (field.Name.Equals(id)){field.SetValue(instance, 1);Console.WriteLine(field.GetValue(instance));}else if (field.Name.Equals(name)){field.SetValue(instance, 张三);Console.WriteLine(field.GetValue(instance));}
}
3应用
有一个 entity 与 entityDto
public class Product
{public int ID { get; set; }public String Name { get; set; }
}
public class ProductDto
{public int ID { get; set; }public String Name { get; set; }
}
然后对 entity 承载的数据进行了实例化并且依次赋值个了 entityDto
Product product new Product()
{ID 1,Name 张三
};
ProductDto productDto new ProductDto();
productDto.ID product.ID;
productDto.Name product.Name;
对于上面的情况还算简单但是如果字段过多手动赋值要花费的时间就大大增加于是我们可以采用反射机制来提高效率自动赋值实际应用时我们可以使用T来进行封装
Product product new Product()
{ID 1,Name 张三
};
Type productType typeof(Product); // Product Type
Type productDtoType typeof(ProductDto);// ProductDto Type
object productDto Activator.CreateInstance(productDtoType); // ProductDto Instance
foreach (var prop in productDtoType.GetProperties())
{// 依次拿取 dto 属性名称在 Product Type 查找并且从 Product Instance 获取值object val productType.GetProperty(prop.Name).GetValue(product);// ProductDto Instance Set Propertie Valprop.SetValue(productDto,val);
}
反射优缺点
优点
动态反射就两个字动态就像 MVC 就是将方法的调用动态化了。数据库或者封装的处理业务逻辑的算法等可以使用配置文件进行动态切换使用。
缺点 coding 复杂面向对象静态编码一两行的代码反射得写个四五行。 避开编译器检查平时写代码我们写错了编译的时候会 error 提示我们如果没有编译器写得代码不知道错多少。但在反射里面编译器对类的操作不会进行检查这也是没有办法检查因为反射是动态的运行时的不像普通编码是静态的。
反射的价值是什么
反射最直观的区别是由已有的固定类型转化为了字符串操作且不需要在项目中进行引用反射是动态的依赖的是字符串。因为依赖的是字符串我们的程序才可配置化、才可易扩展包括平时的框架开发都在大量使用反射MVC、IOC、ORM等。 学习参考自菜鸟厚非
- 上一篇: 爱站长尾关键词挖掘工具广告创意设计与制作
- 下一篇: 安保企业网站模板网站的icp备案信息
相关文章
-
爱站长尾关键词挖掘工具广告创意设计与制作
爱站长尾关键词挖掘工具广告创意设计与制作
- 技术栈
- 2026年03月21日
-
爱站网站排名查询工具山东华建建设有限公司网站
爱站网站排名查询工具山东华建建设有限公司网站
- 技术栈
- 2026年03月21日
-
爱站网能不能挖掘关键词福州产品网页制作的公司
爱站网能不能挖掘关键词福州产品网页制作的公司
- 技术栈
- 2026年03月21日
-
安保企业网站模板网站的icp备案信息
安保企业网站模板网站的icp备案信息
- 技术栈
- 2026年03月21日
-
安达网站制作dede网站文档不能更新
安达网站制作dede网站文档不能更新
- 技术栈
- 2026年03月21日
-
安防公司手机网站asp网站变慢
安防公司手机网站asp网站变慢
- 技术栈
- 2026年03月21日






