反射(Reflection)是什么:
这是.net framework一个帮助类,可以读取并使用matedata。
matedata是一个数据源(一个清单),是编译器生成IL(中间语言)时,用来告诉CLR(公共语言运行时),这个程序集有什么东西,比如:方法,属性,字段。。。。。
反射基本语法。
using System.Reflection;
Assembly assembly = Assembly.Load("ConsoleApp1"); //动态加载程序集 foreach (var item in assembly.GetModules()) //遍历模块 { Console.WriteLine(item.FullyQualifiedName); foreach (var model in item.GetTypes()) //模块类型 { Console.WriteLine(model.FullName); foreach (var ctor in model.GetConstructors()) //构造函数 { Console.WriteLine(ctor.Name); } foreach (var meth in model.GetMethods()) //方法 (默认会获取object基类方法) { Console.WriteLine(meth.Name); } } }
二:利用反射动态创建对象
先声明个接口
public interface IDbhelp { void Show(); }
在设置两个类库,继承接口,实现接口
//MysqlDb public class mysql:IDbhelp { public mysql() { Console.WriteLine($"{this.GetType().Name}被构造"); } public void Show() { Console.WriteLine($"{this.GetType().Name}.Show"); } } //SqlserverDb public class sqlserver:IDbhelp { public sqlserver() { Console.WriteLine($"{this.GetType().Name}被构造"); } public void Show() { Console.WriteLine($"{this.GetType().Name}.Show"); }
在创建个FactoryCreate.cs
public class FactoryCreate { private static string aa = ConfigurationManager.AppSettings["IDbHelps"]; //读取配置文件 public static IDbhelp Create() { Assembly assembly = Assembly.Load(aa.Split(‘,‘)[1]); //动态加载程序集 Type type = assembly.GetType(aa.Split(‘,‘)[0]); //获取类型 dynamic abc = Activator.CreateInstance(type); // Activator.CreateInstance(type)创建对象 ps:对象是object类型 return abc; } }
配置文件:
<appSettings>
<add key="IDbHelps" value="Sqlservr.sqlserver,Sqlservr"/>
</appSettings>
然后调用:
IDbhelp dbhelp = FactoryCreate.Create();
dbhelp.Show();
我们换对象只需要改配置文件,不需要改代码。
如果新添加,需要把新添加程序集的dll拷贝到原来主程序根目录下,然后改配置文件即可。