您的位置:首页 > 其它

.反射机制基础类

2014-02-24 20:12 405 查看
  1.反射机制基础类

  (1)反射机制的功能与介绍

  审查元数据并收集关于它的类型信息的能力称为反射。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等。System.reflection命名空间包含的几个类,允许用户解析这些元数据表的代码:

  System.Reflection.Assembly:表示一个程序集。

  System.Reflection.Module:在模块上执行反射。

  System.Type:表示各种类型。

  System.Reflection.MethodBase:提供有关方法和构造函数的信息。

  System.Reflection.MethodInfo:发现方法的属性并提供对方法元数据的访问。

  System.Reflection.MemberInfo:获取或访问有关成员属性。

  System.Reflection.FieldInfo:发现字段属性并提供对字段元数据的访问权。

  System.Reflection.PropertyInfo:发现或访问属性(Property)的属性(Attribute)。

  System.Reflection.EventInfo:发现事件的属性并提供对事件元数据的访问权。

  System.Reflection.ConstructorInfo:发现或访问类构造函数的属性。

  (2)反射层次模型图

  图像 1

  (3)Assembly类获取程序及信息

  class Program

  {

  static void Main(string[] args)

  {

  Assembly assem = Assembly.Load("mscorlib");//加载系统程序集

  PrintInfo(assem);//输出程序集相关信息

  assem = Assembly.LoadFrom(@"F:\System.Data.SQLite.dll");//或使用LoadFile()方法

  PrintInfo(assem);//输出程序集相关信息

  assem = Assembly.GetExecutingAssembly();//获取当前执行代码的程序集

  PrintInfo(assem);//输出程序集相关信息

  Console.Read();

  }

  //输出程序集相关信息

  static void PrintInfo(Assembly assem)

  {

  Console.WriteLine("程序集全名:" + assem.FullName);

  Console.WriteLine("程序集的版本:" + assem.GetName()。Version);

  Console.WriteLine("程序集初始位置:" + assem.CodeBase);

  Console.WriteLine("程序集位置:" + assem.Location);

  Console.WriteLine("程序集入口:" + assem.EntryPoint);

  Type[] types = assem.GetTypes();//得到该程序集里所有的类型

  Console.WriteLine("程序集下包含的类型数:" + types.Length);

  //foreach (var item in types)

  //{

  // Console.WriteLine("类:" + item.Name);//输出类型名

  //}

  Console.WriteLine("============================\n");

  }

  }

  (4)Module类获取程序集模块信息

  class Program

  {

  static void Main(string[] args)

  {

  Assembly assembly = Assembly.Load("mscorlib");//加载程序集

  Module module = assembly.GetModule("CommonLanguageRuntimeLibrary");//得到指定模块

  Console.WriteLine("模块名:"+module.Name);

  Type[] types = module.FindTypes(Module.FilterTypeName, "Assembly*");

  foreach (var item in types)

  {

  Console.WriteLine("类名:" + item.Name);//输出类型名

  }

  Console.Read();

  }

  }

  (5)Type类获取类型的信息

  class Myclass

  {

  private int Id;

  public string Name;

  public void Method(int i) { }

  }

  class Program

  {

  static void Main(string[] args)

  {

  Type type = typeof(Myclass);

  Console.WriteLine("类型名:" + type.Name);

  Console.WriteLine("类全名:" + type.FullName);

  Console.WriteLine("命名空间名:" + type.Namespace);

  Console.WriteLine("程序集名:" + type.Assembly);

  Console.WriteLine("模块名:" + type.Module);

  Console.WriteLine("基类名:" + type.BaseType);

  Console.WriteLine("是否类:" + type.IsClass);

  Console.WriteLine("类的公共成员:");

  MemberInfo[] memberInfos = type.GetMembers();//得到所有公共成员

  foreach (var item in memberInfos)

  {

  Console.WriteLine("成员类型:" + item.MemberType + "\t成员:" + item);

  }

  Console.Read();

  }

  }

  (6)利用反射调用方法

  class Myclass

  {

  public Myclass()

  {

  Console.WriteLine("创建Myclass对象!");

  }

  public void Method(int i)

  {

  Console.WriteLine("输出值:" + i);

  }

  }

  class Program

  {

  static void Main(string[] args)

  {

  Type t = typeof(Myclass);//得到类型

  object o = Activator.CreateInstance(t);//创建类型的实例

  Console.WriteLine("已创建Myclass对象:" + o);

  MethodInfo method = t.GetMethod("Method");//获得实例的方法

  method.Invoke(o, new object[] { 100 });//调用方法

  Console.Read();

  }

  }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  components