zoukankan      html  css  js  c++  java
  • C#反射

    定义:

    .Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息。

    使用:

    1、通过System.Type,我们可以获取:

    某个类的全名、命名空间、属性等信息。

    static void Main(string[] args)
            {
                //System.Type
                string s = "hello refelction";
                Type t = s.GetType();  //方法一
                Console.WriteLine(t.FullName);
                Type t2 = Type.GetType("system.String", false, true);//方法二
                Console.WriteLine(t2.FullName);
                Type t3 = typeof(string);//方法三
                Console.WriteLine(t3.FullName);
                Console.ReadKey();
            }

    效果图:

     获取方法名:

    //可以通过添加bingflag标志位来筛选方法,public或者instance(不能是静态方法)
            static void GetMothods(Type type,BindingFlags f)
            {
                MethodInfo[] methods = type.GetMethods(f);
                foreach (var info in methods)
                {
                    Console.WriteLine(info.Name);
                    
                }
            }
    使用:
    GetMothods(typeof (string), BindingFlags.Public | BindingFlags.Instance);

    获取属性及字段信息:

    static void GetMothods(Type type)
            {
                MethodInfo[] methods = type.GetMethods();
                FieldInfo[] fields = type.GetFields();
                PropertyInfo[] propertyInfos = type.GetProperties();
                foreach (var info in methods)
                {
                    Console.WriteLine(info.Name); 
                }
                foreach (var fieldInfo in fields)
                {
                    Console.WriteLine(fieldInfo.Name);
                }
                foreach (var propertyInfo in propertyInfos)
                {
                    Console.WriteLine(propertyInfo.Name);
                }
            }
    
            class MyClass
            {
                public string PublicString;
                public string PublicProp { get; set; }
    
                public void Gettest()
                {
                    return;
                }
            }

    2、基于程序集的反射

    assebly动态加载

    namespace Assebly
    {
        class Program
        {
            static void Main(string[] args)
            {
                Assembly assebly;
                assebly = Assembly.Load("mscorlib,2.0.0.0,Neutral,b77a5c561934e089");//动态加载
                Type[] types = assebly.GetTypes();
                //foreach (var type in types)
                //{
                //    //Console.WriteLine(type.Name);
                //}
    
                assebly = Assembly.GetExecutingAssembly();//获取正在执行的程序集
                Type t = assebly.GetType("Assebly.Car", false, true);//获取类,参数为命名空间加方法名
                object obj = Activator.CreateInstance(t);//根据类型创建对象
                MethodInfo mi = t.GetMethod("IsMoving");//获取方法
                var isMoving = (bool) mi.Invoke(obj, null);//执行
                if (isMoving)
                {
                    Console.WriteLine("Is moving");
                }
                else
                {
                    Console.WriteLine("Not is moving");
                }
                Console.ReadLine();
            }
        }
        public class Car
        {
            public bool IsMoving()
            {
                return true;
            }
        }
    }

    3、获取外部程序的元数据:

    //获取外部类的元数据
                Assembly asmAssembly = Assembly.LoadFile(@"C:UsersAdministratorDocumentsVisual Studio 2013Projects	est	est1inDebug	est1.exe");
    
                //获取所有类型
                
                Console.WriteLine("获取所有类型");
                Type[] types = asmAssembly.GetTypes();
                foreach (Type type in types)
                {
                    Console.WriteLine(type.FullName);
                }
    
                Console.WriteLine("获取pulic类型");
                Type[] typePublicTypes = asmAssembly.GetExportedTypes();
                foreach (Type type in typePublicTypes)
                {
                    Console.WriteLine(type.FullName);
                }
    
                //获取指定类型
                Console.WriteLine("获取指定类型");
                Type methodType = asmAssembly.GetType("test1.Model");
                Console.WriteLine(methodType.FullName);
                //执行无参函数
                MethodInfo methodInfo = methodType.GetMethod("method",new Type[]{});
                methodInfo.Invoke(Activator.CreateInstance(methodType),null);
                //重载
                MethodInfo methodInfo2 = methodType.GetMethod("method",new Type[]{typeof(string)});
                methodInfo2.Invoke(Activator.CreateInstance(methodType),new object[]{"田云"});
    
                //构造函数
                ConstructorInfo info = methodType.GetConstructor(new Type[]
                {
                    typeof (string), typeof (int)
                });
                object obj = info.Invoke(new object[] {"田云", 24});
                PropertyInfo NamePro = methodType.GetProperty("Name");
                string name = NamePro.GetValue(obj, null).ToString();
                Console.WriteLine(name);
                Console.ReadLine();

    最后,目前我对反射的理解和运用还比较浅层,以后会继续学习和使用。

    身是菩提树,心如明镜台,时时勤拂拭,勿使惹尘埃。
  • 相关阅读:
    高德地图之 鼠标移进移出时 图标的改变
    高德地图之--海外地图
    angular表单验证
    angularJs 页面加载页面
    angularJs tab样式切换方法之一
    资源
    JavaScript规范
    H5 用 iScroll实现上拉加载 下拉刷新的功能
    ionic项目之极光推送--通知
    Day6 function
  • 原文地址:https://www.cnblogs.com/birdofparadise/p/7015580.html
Copyright © 2011-2022 走看看