【C#】.NET提供了哪些类型来实现反射
实现反射的类型大多数都定义在System.Reflection命名空间之下。
Assembly 定义一个Assembly,它是可重用、无版本冲突并且可自我描述的公共语言运行库应用程序构造块。
AssemblyName 完整描述程序集的唯一标识
EventInfo 发现事件的属性(Attribute)并提供对事件元数据的访问权
FieldInfo 发现字段属性(Attribute)并提供对字段元数据的访问权
LocalVariableInfo 发现局部变量的属性,并提供对局部变量元数据的访问
ManifestResourceInfo 包含清单资源拓扑信息
MemberInfo 获取有关成员属性的信息,并提供对成员元数据的访问
MethodBase 提供有关方法和构造函数的信息
MethodBody 提供对用于方法体的元数据和MSIL的访问
Module 在模块上执行反射
ParameterInfo 发现参数属性(Attribute)并提供对参数元数据的访问
PropertyInfo 发现属性(Property)的属性(Attribute)并提供对属性(Property)元数据的访问
示例:
using System;
using System.Reflection; namespace UseReflection
{
partial class UseReflection
{
/// <summary>
/// 分析程序集
/// </summary>
/// <param name="assembly"></param>
private static void AnalyzeAssembly(Assembly assembly)
{
// 打印程序集的名称
Console.WriteLine("程序集名字:" + assembly.FullName);
// 打印程序集的位置
Console.WriteLine("程序集位置:" + assembly.Location);
// 打印程序集是否存在于GAC中
Console.WriteLine("程序集是否存在于GAC中:" + assembly.GlobalAssemblyCache.ToString());
// 打印包含程序集清单的模块名单
Console.WriteLine("包含程序集清单的模块:", assembly.ManifestModule.Name);
// 打印程序集的CLR版本
Console.WriteLine("运行程序集需要的CLR版本:", assembly.ImageRuntimeVersion); Console.WriteLine("现在开始分析引用的程序集");
Module[] modules = assembly.GetModules();
foreach (Module module in modules)
{
AnalyzeModule(module);
}
} /// <summary>
/// 分析模块
/// </summary>
/// <param name="module"></param>
private static void AnalyzeModule(Module module)
{
Console.WriteLine("模块名:" + module.Name);
Console.WriteLine("模块的UUID:" + module.ModuleVersionId);
Console.WriteLine("开始分析模块下的类型");
Type[] types = module.GetTypes();
foreach (Type type in types)
{
AnalyzeType(type);
}
} /// <summary>
/// 分析类型
/// </summary>
/// <param name="type"></param>
private static void AnalyzeType(Type type)
{
Console.WriteLine("类型名字:" + type.Name);
Console.WriteLine("类型的类别:" + type.Attributes);
if (type.BaseType != null)
{
Console.WriteLine("类型的基类是:" + type.BaseType.Name);
}
Console.WriteLine("类型的GUID:" + type.GUID);
// 设置感兴趣的类型成员
BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
// 分析成员
FieldInfo[] fields = type.GetFields(flags);
if (fields.Length > )
{
Console.WriteLine("开始分析类型的成员");
foreach (FieldInfo field in fields)
{
AnalyzeField(field);
}
}
// 分析包含的方法
MethodInfo[] methods = type.GetMethods(flags);
if (methods.Length > )
{
Console.WriteLine("开始分析类型的方法");
foreach (MethodInfo method in methods)
{
AnalyzeMethod(method);
}
}
// 分析属性
PropertyInfo[] properties = type.GetProperties(flags);
if (properties.Length > )
{
Console.WriteLine("开始分析类型的属性");
foreach (PropertyInfo property in properties)
{
AnalyzeProperty(property);
}
}
} /// <summary>
/// 分析成员
/// </summary>
/// <param name="field"></param>
private static void AnalyzeField(FieldInfo field)
{
Console.WriteLine("成员名字:" + field.Name);
Console.WriteLine("成员的类别:" + field.Attributes);
Console.WriteLine("成员的类型名:" + field.FieldType.Name);
} /// <summary>
/// 分析方法
/// </summary>
/// <param name="method"></param>
private static void AnalyzeMethod(MethodInfo method)
{
Console.WriteLine("方法名字:" + method.Name);
Console.WriteLine("方法的类别:" + method.Attributes);
Console.WriteLine("开始分析方法的参数");
ParameterInfo[] parameters = method.GetParameters();
if (parameters.Length <= )
{
Console.WriteLine("方法没有参数");
}
foreach (ParameterInfo parameter in parameters)
{
AnalyzeParameter(parameter);
}
Console.WriteLine("分析方法的返回参数");
ParameterInfo retpar = method.ReturnParameter;
AnalyzeParameter(retpar);
} /// <summary>
/// 分析方法参数
/// </summary>
/// <param name="parameter"></param>
private static void AnalyzeParameter(ParameterInfo parameter)
{
Console.WriteLine("参数名字:" + parameter.Name);
Console.WriteLine("参数的类别:" + parameter.Attributes);
Console.WriteLine("参数的类型:" + parameter.ParameterType.Name);
} /// <summary>
/// 分析属性
/// </summary>
/// <param name="property"></param>
private static void AnalyzeProperty(PropertyInfo property)
{
Console.WriteLine("属性名字:" + property.Name);
Console.WriteLine("属性的类别:" + property.Attributes);
Console.WriteLine("是否可读:" + property.CanRead.ToString());
Console.WriteLine("是否可写:" + property.CanWrite.ToString());
} }
}
using System;
using System.Reflection;
using System.Security.Permissions; namespace UseReflection
{
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
partial class UseReflection
{
static void Main(string[] args)
{
Assembly assembly = Assembly.LoadFrom(@"..\..\..\..\SimpleAssembly\SimpleAssembly\bin\Debug\SimpleAssembly.exe");
AnalyzeAssembly(assembly); // 创建一个程序集中的类型的对象
// 这里尝试创建SimpleAssembly对象
Console.WriteLine("利用反射创建类型");
string[] pars = { "测试反射" };
object o = assembly.CreateInstance(assembly.GetModules()[].GetTypes()[].ToString(), true, BindingFlags.CreateInstance, null, pars, null, null);
Console.WriteLine(o);
Console.Read();
}
}
}
【C#】.NET提供了哪些类型来实现反射的更多相关文章
- 为什么 Java 不提供无符号类型呢?
网上查资料,无意中找到一个java写的开源论坛,用的人还挺多 http://jforum.net/ 查MD5,了解到 Java getBytes方法详解(字符集问题) http://liushilan ...
- PPK提供的浏览器类型及版本检测方法
PPK提供的浏览器类型及版本检测方法 一个常用但是被高估的Javascript函数就是浏览器检测.有些时候,你想给出一个说明或者加载一个页面来提示用户,以免使用Safari等浏览器. 使用方法: ...
- .NET 错误 47 存储区提供程序工厂类型“Oracle.DataAccess.Client.OracleClientFactory”未实现 IServiceProvider 接口。请使用实现该接口的存储区提供程序。
问题描述: 最近用VS2010连接ORACLE数据库的时候突然报错“错误 47 存储区提供程序工厂类型“Oracle.DataAccess.Client.OracleClientFactory”未实现 ...
- Go part 7 反射,反射类型对象,反射值对象
反射 反射是指在程序运行期间对程序本身进行访问和修改的能力,(程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分,在运行程序时,程序无法获取自身的信息) 支持反射的语言可以在程序编 ...
- Struts2框架提供的结果类型?
已配置结果类型名 类 名 描 述 dispatcher org.apache.struts2.dispatcher.ServletDispatcherResult 默认结果类型,用来呈现JSP页面 c ...
- ASP.NET Web API 数据提供系统相关类型及其关系
- 使用spring提供的ReflectionUtils简化项目中反射代码的复杂性
在项目中有时候我们会使用到反射的功能,如果使用最原始的方法来开发反射的功能的话肯能会比较复杂,需要处理一大堆异常以及访问权限等问题.spring中提供了ReflectionUtils 这个反射的工具类 ...
- Java编程思想(十五) —— 类型信息之反射
讲完.class,Class之后,继续. 1)泛化的Class引用 Class也能够增加泛型,增加之后会进行类型检查. 贴一下书上原话,Class<?>优于Class,尽管他们是等价的,C ...
- 使用dynamic类型来优化反射
什么是dynamic类型?微软给出的官方文档中这样解释:在通过 dynamic 类型实现的操作中,该类型的作用是绕过编译时类型检查. 改为在运行时解析这些操作. dynamic 类型简化了对 COM ...
随机推荐
- 大工程(bzoj 3611)
Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上. 在 2 个国家 a,b 之间建一条新通 ...
- InnoDB的多版本并发控制(MMVC)
InnoDB的MVCC之(乐观锁),是通过在每行记录保存两个隐藏列来实现的.这两个列,一个是存创建时间,一个是删除时间,这里的时间指的是,系统版本号,并不是真正的时间值. 每开始一个新的事务,系统版本 ...
- 【排序算法】java实现
1.冒泡排序 最简单的排序实现,冒泡排序,是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止. //冒泡排序 private int[] bubbleSo ...
- c++ poco StreamSocket tcpclient测试用例
1.代码 #include <iostream> #include "Poco/Net/Socket.h" #include "Poco/Net/Stream ...
- js比对一维数组全等的算法
//辅助方法1,返回某个值在数组中的位置 Array.prototype.indexOf = function (e) { for (var i = 0, l = this.length; i < ...
- bottle框架学习(1):命令行
在最初的一段代码,内容如下: if __name__ == '__main__': from optparse import OptionParser _cmd_parser = OptionPars ...
- HDU 2639 Bone Collector II【01背包 + 第K大价值】
The title of this problem is familiar,isn't it?yeah,if you had took part in the "Rookie Cup&quo ...
- NYOJ 71 乘船问题【贪心】
时间复杂度O(n) 有n个人,第i个人的重量为w[i],每艘船的最大载重量均为c,且最多只能乘两个人.用最少的船装载所有人. 思路:从最轻的开始考虑,让最轻的和最重的一条船,若超出重量则可判定最重的只 ...
- Python的程序结构[3] -> 变量/Variable[1] -> LEGB 法则
LEGB法则 / LEGB Rule LEGB 变量搜索顺序 ---- 来源于<Python学习手册>/ Learning Python Page 419 ---- Python 的变量名 ...
- nginx的location匹配
http://www.cnblogs.com/lidabo/p/4169396.html 这个博主写的非常好 location: 先匹配普通location,再匹配正则表达式 1.而且选择了最大前缀匹 ...