c#反射

反射(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();

c#反射

我们换对象只需要改配置文件,不需要改代码。

如果新添加,需要把新添加程序集的dll拷贝到原来主程序根目录下,然后改配置文件即可。

c#反射

上一篇:在windows 10中启动WSL2 并安装Linux( Ubuntu 为例)并运行docker


下一篇:Windows常用快捷操作