实现反射的类型大多数都定义在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提供了哪些类型来实现反射的更多相关文章

  1. 为什么 Java 不提供无符号类型呢?

    网上查资料,无意中找到一个java写的开源论坛,用的人还挺多 http://jforum.net/ 查MD5,了解到 Java getBytes方法详解(字符集问题) http://liushilan ...

  2. PPK提供的浏览器类型及版本检测方法

    PPK提供的浏览器类型及版本检测方法   一个常用但是被高估的Javascript函数就是浏览器检测.有些时候,你想给出一个说明或者加载一个页面来提示用户,以免使用Safari等浏览器. 使用方法: ...

  3. .NET 错误 47 存储区提供程序工厂类型“Oracle.DataAccess.Client.OracleClientFactory”未实现 IServiceProvider 接口。请使用实现该接口的存储区提供程序。

    问题描述: 最近用VS2010连接ORACLE数据库的时候突然报错“错误 47 存储区提供程序工厂类型“Oracle.DataAccess.Client.OracleClientFactory”未实现 ...

  4. Go part 7 反射,反射类型对象,反射值对象

    反射 反射是指在程序运行期间对程序本身进行访问和修改的能力,(程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分,在运行程序时,程序无法获取自身的信息) 支持反射的语言可以在程序编 ...

  5. Struts2框架提供的结果类型?

    已配置结果类型名 类 名 描 述 dispatcher org.apache.struts2.dispatcher.ServletDispatcherResult 默认结果类型,用来呈现JSP页面 c ...

  6. ASP.NET Web API 数据提供系统相关类型及其关系

  7. 使用spring提供的ReflectionUtils简化项目中反射代码的复杂性

    在项目中有时候我们会使用到反射的功能,如果使用最原始的方法来开发反射的功能的话肯能会比较复杂,需要处理一大堆异常以及访问权限等问题.spring中提供了ReflectionUtils 这个反射的工具类 ...

  8. Java编程思想(十五) —— 类型信息之反射

    讲完.class,Class之后,继续. 1)泛化的Class引用 Class也能够增加泛型,增加之后会进行类型检查. 贴一下书上原话,Class<?>优于Class,尽管他们是等价的,C ...

  9. 使用dynamic类型来优化反射

    什么是dynamic类型?微软给出的官方文档中这样解释:在通过 dynamic 类型实现的操作中,该类型的作用是绕过编译时类型检查. 改为在运行时解析这些操作. dynamic 类型简化了对 COM ...

随机推荐

  1. 大工程(bzoj 3611)

    Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道.  我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上.  在 2 个国家 a,b 之间建一条新通 ...

  2. InnoDB的多版本并发控制(MMVC)

    InnoDB的MVCC之(乐观锁),是通过在每行记录保存两个隐藏列来实现的.这两个列,一个是存创建时间,一个是删除时间,这里的时间指的是,系统版本号,并不是真正的时间值. 每开始一个新的事务,系统版本 ...

  3. 【排序算法】java实现

    1.冒泡排序 最简单的排序实现,冒泡排序,是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止. //冒泡排序 private int[] bubbleSo ...

  4. c++ poco StreamSocket tcpclient测试用例

    1.代码 #include <iostream> #include "Poco/Net/Socket.h" #include "Poco/Net/Stream ...

  5. js比对一维数组全等的算法

    //辅助方法1,返回某个值在数组中的位置 Array.prototype.indexOf = function (e) { for (var i = 0, l = this.length; i < ...

  6. bottle框架学习(1):命令行

    在最初的一段代码,内容如下: if __name__ == '__main__': from optparse import OptionParser _cmd_parser = OptionPars ...

  7. 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 ...

  8. NYOJ 71 乘船问题【贪心】

    时间复杂度O(n) 有n个人,第i个人的重量为w[i],每艘船的最大载重量均为c,且最多只能乘两个人.用最少的船装载所有人. 思路:从最轻的开始考虑,让最轻的和最重的一条船,若超出重量则可判定最重的只 ...

  9. Python的程序结构[3] -> 变量/Variable[1] -> LEGB 法则

    LEGB法则 / LEGB Rule LEGB 变量搜索顺序 ---- 来源于<Python学习手册>/ Learning Python Page 419 ---- Python 的变量名 ...

  10. nginx的location匹配

    http://www.cnblogs.com/lidabo/p/4169396.html 这个博主写的非常好 location: 先匹配普通location,再匹配正则表达式 1.而且选择了最大前缀匹 ...