【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 > 0)
            {
                Console.WriteLine("开始分析类型的成员");
                foreach (FieldInfo field in fields)
                {
                    AnalyzeField(field);
                }
            }
            // 分析包含的方法
            MethodInfo[] methods = type.GetMethods(flags);
            if (methods.Length > 0)
            {
                Console.WriteLine("开始分析类型的方法");
                foreach (MethodInfo method in methods)
                {
                    AnalyzeMethod(method);
                }
            }
            // 分析属性
            PropertyInfo[] properties = type.GetProperties(flags);
            if (properties.Length > 0)
            {
                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 <= 0)
            {
                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()[0].GetTypes()[0].ToString(), true, BindingFlags.CreateInstance, null, pars, null, null);
            Console.WriteLine(o);
            Console.Read();
        }
    }
}
时间: 2024-10-12 03:47:53

【C#】.NET提供了哪些类型来实现反射的相关文章

Nginx官网提供的版本类型

Nginx官网提供了三个类型的版本Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版Stable version:最新稳定版,生产环境上建议使用的版本Legacy versions:遗留的老版本的稳定版

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

讲完.class,Class之后,继续. 1)泛化的Class引用 Class也可以加入泛型,加入之后会进行类型检查. 贴一下书上原话,Class<?>优于Class,虽然他们是等价的,Class<?>的好处是碰巧或疏忽使用了一个非具体的类引用.我搞不懂这个所谓非具体是什么? 后面弄懂了,其实<?>作为通配符,就是未知的,直接写结论的话不能写个具体类型吧,作者的意思其实就是说加了泛型的Class就是选择了非具体的版本. 加入泛型的原因是提供编译期间的类型检查,操作失误的

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

在项目中有时候我们会使用到反射的功能,如果使用最原始的方法来开发反射的功能的话肯能会比较复杂,需要处理一大堆异常以及访问权限等问题.spring中提供了ReflectionUtils 这个反射的工具类,如果项目使用spring框架的话,使用这个工具可以简化反射的开发工作. 我们的目标是根据bean的名称.需要调用的方法名.和要传递的参数来调用该bean的特定方法. 下面直接上代码: import org.springframework.beans.factory.annotation.Autow

.NET基础 (17)反射

反射1 请解释反射的基本原理和其实现的基石2 .NET提供了哪些类型来实现反射3 如何实现动态地发射程序集4 如何利用反射来实现工厂模式 反射1 请解释反射的基本原理和其实现的基石 反射是一种动态分析程序集.模块.类型.字段等目标对象的机制,它的实现依托于元数据.元数据是存储在PE文件中的数据块,它详细记录了程序集后模块内部的结构.引用类型.程序集和清单. 2 .NET提供了哪些类型来实现反射 在System.Reflection命名空间下,.NET提供了丰富的实现反射机制的类型,可以达到读取元

摘录-IT企业必读的200个.NET面试题-06 .NET中的高级特性

委托 Q: 请解释委托的基本原理 委托是一类继承自System.Delegate的类型,每个委托对象至少包含了一个指向某个方法的指针,委托实现了回调方法的机制. Q: 委托回调静态方法和实例方法的区别 当委托绑定静态方法时,内部的对象成员变量_target将会被设置为null,而当委托绑定实例方法时,_target将会设置成指向该实例方法所属类型的一个实例对象,当委托被执行时,该对象实例将被用来调用实例方法. Q: 什么是链式委托 链式委托是指一个由委托串成的链表,当链表上的一个委托被回调时,所

我对于java基本类型的理解

问:为什么基本类型数组不能和Object数组对传呢?答:那是因为基本类型数组虽然被看作成一个引用类型,但是基本类型数组里的每个元素还是基本类型,但是java并没有提供对基本类型的操作的方法所以不能转为Object数组类型,同理把对应的基本类型数组转为对应包装类数组即可在方法中使用Object数组传递参数 问:为什么基本类型传递给Object参数却可以呢?答:java有种名为自动包装的机制,在传递给Object行参时,会把该基本类型通过包装机制成为一个新的类.在java中每一个基本类型都对应着相应

struts2逻辑视图类型汇总与解释(转)

在struts2框架中,当action处理完之后,就应该向用户返回结果信息,该任务被分为两部分:结果类型和结果本身. 结果类型提供了返回给用户信息类型的实现细节.结果类型通常在Struts2中就已预定义好了(见下表),或者是由插件提供,开发人员也可以自定义结果类型.默认配置的结果类型是dispatcher,该结果类型使用JSP来向用户显示结果.当定义了结果类型之后,该结果类型可以在不同的action中重复使用. ? Struts2框架提供的结果类型 已配置结果类型名 类 名 描 述 dispat

集合类型

http://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapter2/04_Collection_Types.html 本页包含内容: 数组(Arrays) 字典(Dictionaries) 集合的可变性(Mutability of Collections) Swift 语言提供经典的数组和字典两种集合类型来存储集合数据.数组用来按顺序存储相同类型的数据.字典虽然无序存储相同类型数据值但是需要由独有的标识符引用

C++ Primer 学习笔记_102_特殊工具与技术 --运行时类型识别[续]

特殊工具与技术 --运行时类型识别[续] 三.RTTI的使用 当比较两个派生类对象的时候,我们希望比较可能特定于派生类的数据成员.如果形参是基类引用,就只能比较基类中出现的成员,我们不能访问在派生类中但不在基类中出现的成员. 因此我们可以使用RTTI,在试图比较不同类型的对象时返回假(false). 我们将定义单个相等操作符.每个类定义一个虚函数 equal,该函数首先将操作数强制转换为正确的类型.如果转换成功,就进行真正的比较:如果转换失败,equal 操作就返回 false. 1.类层次 c