专栏首页明丰随笔浅谈.Net反射 4

浅谈.Net反射 4

反射程序集

在.NET中,程序集是进行部署、版本控制的基本单元。

System.Reflection命名空间下的Assembly类型,代表了一个程序集,并包含了关于程序集的信息。

本文将演示如何获取程序集信息。

获取Assembly对象有很多种方法:

1. 使用Assembly类型提供的静态方法LoadFrom()

2. 使用Assembly类型提供的静态方法Load()

3. 想获得当前代码所在的程序集,可以使用Assembly类型的静态方法GetExecutingAssembly()

4. 在获得一个Type类型实例以后,还可以使用该实例的Assembly属性来获得其所在的程序集

下面代码对上面的4种情况进行演示:

//提供的是程序集的文件名,在将一个程序集添加到项目引用中以后,可以直接写“文件名.dll”
Assembly assembly1 = Assembly.LoadFrom("ReflectionDemo.exe");
//如果想加载一个不属于当前项目的程序集,则需要给出全路径
Assembly assembly2 = Assembly.LoadFrom(@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.dll");
//使用Load()方法的时候,只用提供程序集名称即可,而非程序集的文件名。
Assembly assembly3 = Assembly.Load("ReflectionDemo");
//使用Assembly类型的静态方法GetExecutingAssembly,它返回包含当前执行代码所在的程序集。
Assembly assembly5 = Assembly.GetExecutingAssembly();
//使用Type实例的Assembly属性来获得其所在的程序集
Type t = typeof(int);
Assembly asm = t.Assembly;

一个程序集可能有多个模块(Module)构成,每个模块又可能包含很多的类型。现在看下反射提供了哪些能力让我们获取关于程序集的信息,如表所示(只列出了部分常用的)。

为了方便进行后面的测试,在解决方案中再添加一个Demo类库项目,程序集中只包含一个命名空间Demo,为了体现尽可能多的类型同时又尽量保持简单,其代码如下:

namespace Demo
{
    public abstract class BaseClass
    {
    }

    public struct DemoStruct { }

    public delegate void DemoDelegate(Object sender, EventArgs e);

    public enum DemoEnum
    {
        terrible, bad, common = 4, good, wonderful = 8
    }

    public interface IDemoInterface
    {
        void SayGreeting(string name);
    }

    public interface IDemoInterface2 { }

    public sealed class DemoClass : BaseClass, IDemoInterface, IDemoInterface2
    {
        private string _name;
        public string city;
        public readonly string title;
        public const string text = "Const Field";
        public event DemoDelegate myEvent;
        public string Name
        {
            private get { return _name; }
            set { _name = value; }
        }

        public DemoClass()
        {
            title = "Readonly Field";
        }

        public void SayGreeting(string name)
        {
            Console.WriteLine("Morning :" + name);
        }

        public class NestedClass { }
    }
}

引用Demo项目,添加一个方法AssemblyExplore(),查看Demo项目生成的程序集中定义的全部类型:

public static void AssemblyExplore()
{
  StringBuilder sb = new StringBuilder();
  Assembly asm = Assembly.Load("Demo");
  sb.AppendLine("FullName:" + asm.FullName);
  sb.AppendLine("Location:" + asm.Location);
  Module[] modules = asm.GetModules();
  foreach (Module module in modules)
  {
    sb.AppendLine("Module:" + module);
    Type[] types = module.GetTypes();
    foreach (Type t in types)
    {
      sb.AppendLine(" Type:" + t);
    }
  }
  Console.WriteLine(sb.ToString());
}

运行结果:

可以清楚看出来程序集中的信息。

本文回顾:

加载程序集

程序集的元数据有哪些

代码实现部分

本文分享自微信公众号 - 明丰随笔(liumingfengwx2),作者:刘明丰

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • IOC编程

    2. 开放/封闭原则: 添加任何新行为,应该是扩展到新类中,而不应该直接修改原来运行良好的代码。

    小蜜蜂
  • 浅谈.Net反射 11

    浅谈.Net反射系列基本来到了尾声,本文主要从.Net Framework的源码角度去分析:

    小蜜蜂
  • AOP编程

    Aspect Oriented Programming(AOP),面向切面编程。AOP主要解决的问题是针对业务处理过程中对一些逻辑进行切面提取,它可以分散在处理...

    小蜜蜂
  • 转载 Java设计模式

    设计模式; 一个程序员对设计模式的理解: “不懂”为什么要把很简单的东西搞得那么复杂。后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精...

    用户1518699
  • 23种设计模式详解(三)

    模板方法模式就是指:一个抽象类中,有一个主方法,再定义1...n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类...

    南风
  • 设计模式-装饰者模式

    用户5927264
  • IOC编程

    2. 开放/封闭原则: 添加任何新行为,应该是扩展到新类中,而不应该直接修改原来运行良好的代码。

    小蜜蜂
  • Java内功心法,行为型设计模式

    使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 将这些对象连成一条链,并沿着这条链发送该请求,直到有一个对象处理它为止。

    李红
  • Java内功心法,行为型设计模式

    使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 将这些对象连成一条链,并沿着这条链发送该请求,直到有一个对象处理它为止。

    李红
  • 抽象工厂模式

    ?原文地址为https://www.cnblogs.com/haixiang/p/12055272.html,转载请注明出处!

    海向

扫码关注云+社区

领取腾讯云代金券