【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 ...
随机推荐
- hdu 4679 树的直径
/* 题目大意:给n个点n-1条边的树,求删除哪条边时两个树中最大的直径与边权的乘积最小. 树的直径(Diameter)是指树上的最长简单路. 直径的求法:两遍BFS (or DFS) 若删除的边不是 ...
- Mysql性能优化【转】
mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面进行优化,最终性能就会有大的提升. Mysql数据库的优化技术 对mysql优化是一个综合性的技术,主要包括 表的设计合理化(符合3NF ...
- lca板子
#include<cstdio> #include<cstring> #include<algorithm> #define LL long long using ...
- DNS 资源记录解释
;SOA授权的开始;;SOA或授权的开始记录用来表示区域的启动;每个区域必须只有一个SOA记录;从名字服务器,在不能和主服务器通信的情况下,将提供12小时DNS服务, 在指定的时间后停止为那个区域提供 ...
- 如何防止Android反编译
转自: http://my.eoe.cn/sandking/archive/19772.html http://www.cnblogs.com/zdz8207/archive/2012/01/28/d ...
- BZOJ1588 [HNOI2002]营业额统计 splay模板
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 16189 Solved: 6482 [Submit][S ...
- react 使用antd的TreeSelect树选择组件实现多个树选择循环
需求说明,一个帐号角色可以设置管理多个项目的菜单权限 且菜单接口每次只能查询特定项目的菜单数据[无法查全部] 开发思路: 1,获取项目接口数组,得到项目数据 2,循环项目数据,以此为参数递归查询菜单数 ...
- (5)java基础知识2
一.方法 方法相当于功能的实现. public static int max (int num1, int num2) {....................} ...
- 818E - Card Game Again(尺取法)
818E - Card Game Again 题意 给出一个数列,选择连续的一段使得这些数字的乘积是 k 的倍数,问合法的方案数. 分析 尺取法.设 num 为连续的数的乘积,只要对于 k 的每个素因 ...
- kotlin扩展函数
kotlin 扩展函数 https://www.kotlincn.net/docs/reference/extensions.html 扩展函数在android中的应用 fun AppCompatAc ...