代码改变世界

【C#】.NET提供了哪些类型来实现反射

2016-01-26 21:55  JiaJia.Oct  阅读(339)  评论(0编辑  收藏  举报

实现反射的类型大多数都定义在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();
        }
    }
}