关于反射

1.1 反射的作用

简单来说,反射提供这样几个能力:

1、查看和遍历类型(及其成员)的基本信息和程序集元数据(metadata);

2、迟绑定(Late-Binding)方法和属性。

3、动态创建类型实例(并可以动态调用所创建的实例的方法、字段、属性)。序章中,我们所采用的那个例子,只是反射的一个用途:查看类型成员信息。接下来的几个章节,我们将依次介绍反射所提供的其他能力。

2. 反射程序集

在.net中,程序集是进行部署,版本控制额基本单位,它包含了ixanggua你得模块和类型,下面如何通过反射获取程序集信息。

加载程序集

Assembly asm = Assembly.LoadFrom("Demo.dll");

Assembly asm = Assembly.Load("Demo");

Assembly asm =Assembly.LoadFrom(@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Web.dll");

Assembly as = Assembly.GetExecutingAssembly();//返回当前执行的代码的程序集。

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

Type t = typeof(int)
Assembly asm = t.Assembly;

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 class NestedClass { }

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

}

 

 

public static void AssemblyExplore() {
    StringBuilder sb = new StringBuilder();

    Assembly asm = Assembly.Load("Demo");

    sb.Append("FullName(全名):" + asm.FullName + "\n");
    sb.Append("Location(路径):" + asm.Location + "\n");

    Type[] types = asm.GetTypes();

    foreach (Type t in types) {
       sb.Append("   类型:" + t + "\n");
    }

    Console.WriteLine(sb.ToString());
}

调用此方法可以获得程序集中的类型的信息

FullName(全名):Demo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null Location(路径):

E:\MyApp\TypeExplorer\SimpleExplorer\bin\Debug\Demo.dll

模块: Demo.dll

类型:Demo.BaseClass 

类型:Demo.DemoStruct

类型:Demo.DemoDelegate

类型:Demo.DemoEnum

类型:Demo.IDemoInterface

类型:Demo.IDemoInterface2

类型:Demo.DemoClass

类型:Demo.DemoClass+NestedClass

 

通过  

Type t = typeof(DemoClass);

TypeExplore(t);

可以进一步获取类型里面的信息

。Type类提供 GetMembers()、GetMember()、FindMember()等方法用于获取某个成员类型。

posted @ 2018-07-06 17:27  wonderfulviews  阅读(170)  评论(0编辑  收藏  举报