阅读目录
开始阅读 完整代码下载
反射提供描述程序集、模块和类型的对象(Type 类型)。 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后调用其方法或访问其字段和属性。 如果代码中使用了特性,可以利用反射来访问它们。大白话说就是,可以把编译成exe或者dll的程序集,加载到内存创建对象来使用,后面会扩展一个案例,程序集里面通过配置切换多个数据库使用。
做实现之前需要准备一个dll文件,我这里用的net5编译的,下面给出源代码,编译好后,另外创建一个项目来实现非泛型反射的实现。
注意:Assembly.LoadFile只载入相应的dll文件,比如Assembly.LoadFile("a.dll"),则载入a.dll,假如a.dll中引用了b.dll的话,b.dll并不会被载入。Assembly.LoadFrom则不一样,它会载入dll文件及其引用的其他dll,比如上面的例子,b.dll也会被载入。
1 // 2 using System; 3 4 namespace Demo02_DLL 5 { 6 [Author("BigBox777")] 7 public class Test 8 { 9 public int Id=2; 10 public string Name { get; set; } 11 public DateTime Time { get; set; } 12 public Test() 13 { 14 Name = "BigBox777"; 15 Time = DateTime.Parse("1971-01-01 12:00:00"); 16 Console.WriteLine("调用了构造函数:public Test()"); 17 } 18 public Test(string name) 19 { 20 Name = name; 21 Time = DateTime.Parse("1971-01-01 12:00:00"); 22 Console.WriteLine($"调用了构造函数:public Test(string name),传入参数:{name}"); 23 } 24 public void Show() 25 { 26 Console.WriteLine($"Id:{Id},Name:{Name},Time:{Time}"); 27 } 28 } 29 //自定义特性 30 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = true)] 31 public class Author : System.Attribute 32 { 33 string name; 34 public double version; 35 36 public Author(string name) 37 { 38 this.name = name; 39 40 version = 1.0; 41 } 42 43 public string GetName() 44 { 45 return name; 46 } 47 } 48 }