类型反射与晚期绑定
2013-05-24 09:33
393 查看
在.net中,反射是一个运行库类型发现的过程。使用反射服务,可以得到一个给定*.dll或*.exe程序集所包含的所有类型的列表。
命名空间System.Reflection包含了大量与反射相关的类型,要理解如何使用System.Reflection命名空间编程读取.net元数据,首先要理解System.Type类型
System.Type类型定义了很多成员,可以用来检测某个类型的元数据,它们返回的类型大多数位于System.reflection命名空间中。如:Type.GetMethods()返回一个MethodInfo类型的数组。Type类型的各种成员就不一一列举。
下面是得到Type类型的三种方式:
1.System.Object.GetType()
object obj=new Object();
Type t=obj.GetType();
2.typeOf()
Type t=typeof(Object);
3.System.Type.GetType()
该方法的传入类型的完全限定名
Type t=System.Type.GetType(“System.Object”);
命名空间System.Reflection包含了大量与反射相关的类型,要理解如何使用System.Reflection命名空间编程读取.net元数据,首先要理解System.Type类型
System.Type类型定义了很多成员,可以用来检测某个类型的元数据,它们返回的类型大多数位于System.reflection命名空间中。如:Type.GetMethods()返回一个MethodInfo类型的数组。Type类型的各种成员就不一一列举。
下面是得到Type类型的三种方式:
1.System.Object.GetType()
object obj=new Object();
Type t=obj.GetType();
2.typeOf()
Type t=typeof(Object);
3.System.Type.GetType()
该方法的传入类型的完全限定名
Type t=System.Type.GetType(“System.Object”);
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace TypeReflection { class Program { static void Main(string[] args) { //TypeTest(); //AsmTest(); //string displayname = null; //displayname = "System.Windows.Forms," + "Version=4.0.0.0," + "PublicKeyToken=b77a5c561934e089," + @"Culture="""; //Assembly asm = Assembly.Load(displayname); //DisplayTypesinAsm(asm); ActivatorTest(); } private static void TypeTest() { do { Console.WriteLine("Enter a type name or enter Q to quit:"); string str = Console.ReadLine(); if (str.ToUpper() == "Q") { break; } try { Type t = Type.GetType(str); GetFields(t); GetProperties(t); GetMethods(t); } catch { Console.WriteLine("Sorry,can't find type."); } } while (true); } //获取字段 static void GetFields(Type t) { if (t != null) { Console.WriteLine("*******Fields********"); FieldInfo[] fields = t.GetFields(); foreach(var field in fields) { Console.WriteLine("{0} {1}", field.FieldType, field.Name); } } } //获取属性 static void GetProperties(Type t) { if (t != null) { Console.WriteLine("*******Properties********"); PropertyInfo[] properties = t.GetProperties(); foreach (var property in properties) { Console.WriteLine("{0} {1}", property.PropertyType, property.Name); } } } //获取方法 static void GetMethods(Type t) { if (t != null) { Console.WriteLine("*******Methods********"); MethodInfo[] methods = t.GetMethods(); foreach (var method in methods) { string str = method.ReturnType.ToString() + " " + method.Name + " ("; foreach (var p in method.GetParameters()) { str += p.ParameterType + " " + p.Name + ","; } str += ");"; Console.WriteLine(str); } } } static void AsmTest() { do { Console.WriteLine("Enter a Assembly name or enter Q to quit:"); string str = Console.ReadLine(); if (str.ToUpper() == "Q") { break; } try { Assembly asm = Assembly.LoadFrom(str);//加载程序集 DisplayTypesinAsm(asm); } catch { Console.WriteLine("Sorry,can't find assembly."); } } while (true); } static void DisplayTypesinAsm(Assembly asm) { if (asm != null) { Console.WriteLine("********Types in Assembly********"); Console.WriteLine("=>{0}", asm.FullName); var types = from type in asm.GetTypes() where type.IsEnum && type.IsPublic select type; foreach (var t in types) { Console.WriteLine("Type:{0}", t); } } } //晚期绑定 static void ActivatorTest() { try { string displayname = null; displayname = "System.Windows.Forms," + "Version=4.0.0.0," + "PublicKeyToken=b77a5c561934e089," + @"Culture="""; Assembly asm = Assembly.Load(displayname);//加载程序集 Type t = asm.GetType("System.Windows.Forms.Form");//获取程序集中的类型 object obj= System.Activator.CreateInstance(t);//获取类型的实例 MethodInfo mi = t.GetMethod("ToString");//获取类型的实例方法 object s= mi.Invoke(obj,null);//方法的调用 Console.WriteLine(s); } catch(Exception ex) { Console.WriteLine(ex.Message); } } } }
相关文章推荐
- 类型反射和晚期绑定
- C#2008与.NET 3.5 高级程序设计读书笔记(16)-- 类型反射、晚期绑定和基于特性的编程
- 反射简介—类型反射和晚期绑定
- .net类型反射与晚期绑定
- [C#]C#学习笔记-类型反射,晚期绑定,进程,对象上下文
- C#类型反射、晚期绑定、特性编程的使用背景与分析
- 反射和晚期绑定
- 初探反射(二)之晚期绑定动态调用实体方法
- golang 反射结构字段类型
- Spring MVC的各种参数绑定方式(请求参数用基础类型和包装类型的区别)(转)
- 自定义可绑定数据的业务对象实体和强类型-Part Two
- 通过反射获得泛型的实际类型参数
- Android 绑定类型服务---绑定服务
- japid-controller自动绑定的数据类型
- 为用户定义的数据类型绑定规则示例.sql
- 通过反射获取父类泛型类型
- spring mvc表单复杂类型数据绑定
- 一种自动反射消息类型的 Google Protobuf 网络传输方案
- 使用反射机制绕过泛型检查类型
- java 反射中包含基础类型参数的问题