[C#/.NET]使用Assembly反射和Linq读取指定命名空间下所有类的所有字段

C#开发 2015-11-27 501浏览 2评论 收藏本文

C#/.NET的反射在很多情况下都会被使用,对于稍微复杂一点的.NET程序来说,反射可以提高我们的开发效率(当然,这里有人会说反射会损失程序的性能,这是个仁者见仁的事情,自己看着办吧。笔者个人认为:如今的高质的硬件配置的情况下,只要你的反射写得没问题,性能问题可以不用考虑。)。本文会给大家分享一下如何利用Assembly.Load()方法来动态加载指定命名空间下所有类的所有字段信息,并把这个字段成员输出到控制台。首先看一下我已经做好的实验的结果图: assembly-load-all-specified-namespace-field-01 没错,本示例实验想达到的效果即为上图呈现的。在这里分享出来,目的是为了帮助还在.NET反射路上摸索的同学们。好了,其他的话就不多说,直接进入示例话题: 一、首先,我们需要创建两个C#[.NET]的项目,分别为一个控制台项目,命名为:AssemblyDemo,和一个类库项目,命名为:AssemblyDemo.Business。 二、在AssemblyDemo.Business项目中创建一个名为Security的文件夹,再在这个Security文件夹中创建两个类文件,分别为:PermissionCode.cs和Role.cs(创建这两个文件的目的只在做实例的结果中显示得现清楚,如果你在跟着本文做示例,那这两个文件的名称和位置都可以根据自己喜好来自定义,但要确保你在后续的实验中能正确读取到程序集的路径)。 现在我们分别向PermisionCode.cs文件和Role.cs文件中添加如下示例代码: PermissionCode.cs:

namespace AssemblyDemo.Business.Security
{
    public class PermissionCode
    {
        public static readonly string Create = "CREATE";
        public static readonly string Delete = "DELETE";
        public static readonly string Update = "UPDATE";
        public static readonly string Query = "QUERY";
    }
}
Role.cs:
namespace AssemblyDemo.Business.Security
{
    public class Role
    {
        public static readonly string Administrator = "ADMINISTRATOR";
        public static readonly string Admin = "ADMIN";
        public static readonly string General = "GENERAL";
    }
}
三、我们在项目AssemblyDemo添加对项目AssemblyDemo.Business的引用,然后我们就可以使用Assembly.Load()来加载程序集AssemblyDemo.Business,然后使用Linq即可读取到指定命名空间下的所有类了 。具体的读取代码如下:
using System;
using System.Linq;
using System.Reflection;

namespace AssemblyDemo
{
    public class Program
    {
        static void Main(string[] args)
        {
            LoadInfoByAssembly();
            Console.ReadKey();
        }

        private static void LoadInfoByAssembly()
        {
            var query = from t in Assembly.Load("AssemblyDemo.Business").GetTypes()
                        where t.IsClass && t.Namespace.Equals("AssemblyDemo.Business.Security", StringComparison.InvariantCultureIgnoreCase)
                        select t;
            ;
            query.ToList().ForEach(x =>
            {
                Console.WriteLine("类命名:{0}", x.Name);
                foreach (var field in x.GetFields())
                {
                    Console.WriteLine("字段名称:{0},字段值:{1}", field.Name, field.GetValue(field.Name));
                }
                Console.WriteLine("========================================\n");

            });
        }
    }
}
好了,本示例还是比较简单的。希望本文对你理解.NET的反射加载程序集有所帮助。

转载请注明:图享网 » [C#/.NET]使用Assembly反射和Linq读取指定命名空间下所有类的所有字段

验证码

文章评论

  • lampo (2016-03-03 21:04)

    谢谢你的肯定,可能是本站的留言功能不太好,更多的朋友查阅到相关资料后就离开了吧。 由于最近事情多,更新落下了,后期也会对站点进行升级和改进。

  • A (2016-03-03 18:01)

    网站做的还可以,咋没人来呢~ :wink: