C# 使用反射进行反射程序集下的某个文件夹下的所有类 或者 某程序集下的所有类

14 篇文章 0 订阅
13 篇文章 0 订阅

一、什么是反射?

反射是指在运行时通过程序对类型、对象等信息进行访问和操作的能力。在C#中,反射可以通过System.Reflection命名空间中的类来实现,比如Type、MethodInfo和PropertyInfo等。通过反射,可以在程序运行时获取类型的信息,创建对象实例、调用方法、设置属性等。反射常用于动态加载程序集、编写通用代码以及实现一些高级功能。

二、本文章例子是在什么情况下形成的?

本文章是在使用sqlsugar的情况下使用,具体需求是如下:
1、开发人员通过创建“实体类”,实体类中已经定义好数据库中需要使用的字段名称与类型。
2、程序启动时,通过Assembly进行获取某个程序集中的所有类(或者某个程序集中某个文件夹中的所有类)。
3、通过反射,把获取的类进行反射,可变成可使用的类。

三、程序实例:

 var basicScope = GetScope(UserDataBase.Basics);//获取连接postgeoSql的字段 GetScope(UserDataBase.Basics)一个方法,里面定义了连接postgeosql的方法
            var currentAssembly = Assembly.LoadFrom("DBManagement.Common.dll");//DBManagement.Common.dll 这个就是你要获取的程序集,也就是你想要获取的类在哪个程序集下面
            var geoEntityTypes = currentAssembly.ExportedTypes.Where(p => p.FullName.StartsWith("DBManagement.Common.Entities")).ToList(); //这个是指定到某个程序集中的指定文件夹下,更加精准到准确位置

            ///进行便利获取的所有的程序集中的类
            foreach (var geoEntityType in geoEntityTypes)
            { 
                var methods = basicScope.CodeFirst.GetType().GetMethods(); //C# GetMethods是一种反射方法,可以用于获取指定对象或类型的方法信息
                foreach (var method in methods)
                {
                    if (method.IsGenericMethod) //IsGenericMethod 是 C# 中的一个方法,它用于检查给定的方法是否为泛型方法。如果是泛型方法,则返回 true,否则返回 false。当使用泛型类型或方法时,它允许在不指定具体类型或方法参数的情况下创建通用代码。
                    {
                        //C# 中的 StringComparison.OrdinalIgnoreCase 表示不区分大小写的字符串比较方式,它适用于任何语言,包括中文。即使字符串中有汉字,使用该比较方式也会忽略其大小写差异,只比较它们的字符编码值。
                        if (string.Equals(method.ToString(), "void InitTable[T]()", StringComparison.OrdinalIgnoreCase))
                        {
                            //MakeGenericMethod是 C# 中的一种方法,它允许您通过动态指定泛型方法的类型参数在运行时创建泛型方法。当您事先不知道参数的类型并且需要生成可以处理传入的任何类型的代码时,这很有用。该函数是命名空间的一部分,可以在表示泛型方法定义的 MethodInfo 对象上调用。
                            var genMethod = method.MakeGenericMethod(geoEntityType);
                            //是C#语言中反射机制中的一个方法,用于通过MethodInfo对象调用指定类型的方法。g
                            genMethod.Invoke(basicScope.CodeFirst, null);
                            if (basicScope.DbMaintenance.IsAnyTable(nameof(geoEntityType), false)) break;//判断表是否存在 不存在则添加并初始化 这个针对sqlsugar
                            basicScope.DbMaintenance.Add(geoEntityType.Name,nameof(geoEntityType)); //用于向数据库中添加新的表或者列。 这个针对sqlsugar
                            basicScope.CodeFirst.InitTables(geoEntityType);//初始化表,通过这个类型
                        }
                    }
                }


            }

四、本文设计的知识点

1、涉及到了如何把反射后的类,再次进行使用。
2、涉及到如何进行获取某个程序集中的所有的类
3、sqlsuagr 的创建表初始化!

本文完!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值