System.Reflection简介
2016-07-01 17:13
225 查看
转载注明出处:点击打开链接
.net的元数据可以完整地描述类型,那么通过System.Reflection,可以在运行时发现类型格式,我们来看一下元数据:
class Class2
{
private int x;
private int y;
public Class2(int a, int b)
{
x = a;
y = b;
}
public int Add()
{
return x+y;
}
}
元数据,请看代码注释
OK,了解了元数据,我们现在来看看上面图中,那些类的基本功能,.NetFrameWork库类的层次程序集包含模块,模块包含类型,类型又包含成员(方法,属性,字段,事件等)。
1.Assembly:主要是加载和操纵一个程序集.
2.ParameterInfo:该类保存给定参数的信息,也就是说方法的参数,可以用该类来操作.
3.Module:访问带有多模块程序集的给定模块,在VS环境下只可以编译出单Module的程序集.
4.MemberInfo:该类是抽象基类,为他的子类定义了公共的行为.如MemberTypes,MemberName等.而他的子类则分别是方法,属性,字段,事件等信息的具体实现.
那么这些类如何来完成类型的反射呢?
在使用.NET创建的程序或组件时,元数据(metadata)和代码(code)都存储于“自成一体”的单元中,这个单元称为装配件。我们可以在程序运行期间访问这些信息。
在System.Reflection中有这样一个class————Assembly,我们可以通过它来加载一个装配件。方法如下:
Assembly assm=Assembly.LoadFrom(fileName);
其中filename是要加载的装配件的文件名称(带路径)。
接下来,我们就可以通过使用System.Reflection内提供的Info classes来获取装配件中的信息了。
事件和属性的反射调用,同上述代码差不多,不再赘述.上面的代码中我们使用了Type这个类型,这里做一下简单的介绍
System.Type定义了大量的成员,可以用来检查一个类型的元数据,如GetMethod,GetFields等方法,基本上一个类型的所有信息都可以得到,很好很强大.呵呵.
.net的元数据可以完整地描述类型,那么通过System.Reflection,可以在运行时发现类型格式,我们来看一下元数据:
class Class2
{
private int x;
private int y;
public Class2(int a, int b)
{
x = a;
y = b;
}
public int Add()
{
return x+y;
}
}
元数据,请看代码注释
TypeDef #2 (02000003) // ------------------------------------------------------- // TypDefName: Class2 (02000003) // Flags : [NestedPrivate] [AutoLayout] [Class] [AnsiClass] [BeforeFieldInit] (00100003) // Extends : 01000002 [TypeRef] System.Object // EnclosingClass : Test.Class1 (02000002) // Field #1 (04000004) // ------------------------------------------------------- // Field Name: x (04000004) ///字段名 // Flags : [Private] (00000001) //访问修饰 // CallCnvntn: [FIELD] // Field type: I4 //字段类型 // // Field #2 (04000005) // ------------------------------------------------------- // Field Name: y (04000005) // Flags : [Private] (00000001) // CallCnvntn: [FIELD] // Field type: I4 // // Method #1 (06000004) // ------------------------------------------------------- // MethodName: .ctor (06000004) ///构造函数 // Flags : [Public] [HideBySig] [ReuseSlot] [SpecialName] [RTSpecialName] [.ctor] (00001886) //访问修饰 // RVA : 0x00002083 // ImplFlags : [IL] [Managed] (00000000) //CLR 托管代码 // CallCnvntn: [DEFAULT] // hasThis // ReturnType: Void //返回类型 // 2 Arguments // Argument #1: I4 // Argument #2: I4 // 2 Parameters //参数列表 // (1) ParamToken : (08000003) Name : a flags: [none] (00000000) //参数类型 // (2) ParamToken : (08000004) Name : b flags: [none] (00000000) // // Method #2 (06000005) // ------------------------------------------------------- // MethodName: Add (06000005) 方法名 // Flags : [Public] [HideBySig] [ReuseSlot] (00000086) //访问修饰 // RVA : 0x00002099 // ImplFlags : [IL] [Managed] (00000000) // CallCnvntn: [DEFAULT] // hasThis // ReturnType: I4 //返回类型 // No arguments. //我们看到在元数据种非常详细的定义了一个类中的任何成员,还包括了程序集所引用的其他程序集的信息
AssemblyRef #1 (23000001) // ------------------------------------------------------- // Token: 0x23000001 // Public Key or Token: b7 7a 5c 56 19 34 e0 89 // Name: mscorlib // Version: 2.0.0.0 // Major Version: 0x00000002 // Minor Version: 0x00000000 // Build Number: 0x00000000 // Revision Number: 0x00000000 // Locale: <null> // HashValue Blob: // Flags: [none] (00000000) // //
OK,了解了元数据,我们现在来看看上面图中,那些类的基本功能,.NetFrameWork库类的层次程序集包含模块,模块包含类型,类型又包含成员(方法,属性,字段,事件等)。
1.Assembly:主要是加载和操纵一个程序集.
2.ParameterInfo:该类保存给定参数的信息,也就是说方法的参数,可以用该类来操作.
3.Module:访问带有多模块程序集的给定模块,在VS环境下只可以编译出单Module的程序集.
4.MemberInfo:该类是抽象基类,为他的子类定义了公共的行为.如MemberTypes,MemberName等.而他的子类则分别是方法,属性,字段,事件等信息的具体实现.
那么这些类如何来完成类型的反射呢?
在使用.NET创建的程序或组件时,元数据(metadata)和代码(code)都存储于“自成一体”的单元中,这个单元称为装配件。我们可以在程序运行期间访问这些信息。
在System.Reflection中有这样一个class————Assembly,我们可以通过它来加载一个装配件。方法如下:
Assembly assm=Assembly.LoadFrom(fileName);
其中filename是要加载的装配件的文件名称(带路径)。
接下来,我们就可以通过使用System.Reflection内提供的Info classes来获取装配件中的信息了。
Assembly asm = Assembly.Load("Test");//dll的名称 Type t = asm.GetType("Test.Class2");//类的完全命名 object obj = Activator.CreateInstance(t); //创建Class2的实例 MethodInfo mi = t.GetMethod("Add");//获取Class2中Add方法的信息. string s = (string)mi.Invoke(obj,null);//执行方法,需要参数1:Class2的实例,2:方法的参数列表. FieldInfo pi = t.GetField("x"); //获取字段信息 pi.GetValue(obj); //得到字段值
事件和属性的反射调用,同上述代码差不多,不再赘述.上面的代码中我们使用了Type这个类型,这里做一下简单的介绍
System.Type定义了大量的成员,可以用来检查一个类型的元数据,如GetMethod,GetFields等方法,基本上一个类型的所有信息都可以得到,很好很强大.呵呵.
相关文章推荐
- 如何在 Linux/Windows/MacOS 上使用 .NET 进行开发
- 如何在 Linux 中安装微软的 .NET Core SDK
- C#.NET获取拨号连接的宽带连接方法
- C#.Net ArrayList的使用方法
- PowerShell中使用.NET将程序集加入全局程序集缓存
- .net(c#)中的new关键字详细介绍
- 由vbs sort引发.NET Framework之间的关系说明
- C#难点逐个击破(6):C#数据类型与.net framework数据类型
- .NET中的async和await关键字使用及Task异步调用实例
- 基于.NET平台常用的框架和开源程序整理
- .Net中的json操作类用法分析
- .net实现序列化与反序列化实例解析
- .NET中的Timer类型用法详解
- Microsoft .Net Remoting系列教程之二:Marshal、Disconnect与生命周期以及跟踪服务
- 关于.net(C#)中的跨进程访问的问题
- .NET实现父窗体关闭而不影响子窗体的方法
- 基于.Net中的数字与日期格式化规则助记词的使用详解
- .NET微信公众号开发之公众号消息处理
- .Net下的签名与混淆图文分析
- .NET 扩展实现代码