关于反射
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()等方法用于获取某个成员类型。