首页 / C#开发 / 正文

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

6463 1评论 发布于: 2015-11-27 读完约需7分钟

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的反射加载程序集有所帮助。

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: 分享一个Javascript(js)生成不重复随机数组的函数

下一篇: Visual Studio 2015 Update 1及TFS 2015 Update 1正式版发布

本文永久链接码友网 » [C#/.NET]使用Assembly反射和Linq读取指定命名空间下所有类的所有字段

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册

热门评论

A (2016-03-03 18:01)

网站做的还可以,咋没人来呢~ :wink:
回复 赞(1)
  • 谢谢你的肯定,可能是本站的留言功能不太好,更多的朋友查阅到相关资料后就离开了吧。 由于最近事情多,更新落下了,后期也会对站点进行升级和改进。

    lampo · 2016-03-03 21:04 赞(0)