• 反射(一)


     [Obsolete("",false)]//明XXX

            static void sendMessage()

            {

                Console.WriteLine("null");

            }

     

            static void sendMessage(string str)

            {

                Console.WriteLine(str);

            }

     

            static void Main(string[] args)

            {

                sendMessage(); //会有

                sendMessage("hhaha");

                Console.Read();

            }

     

    以上,静态方法sendMessage,上面[Obsolete("过时的",false)]/即是特性的应用,警示用户此方法过期。

    我们现在知道了特性用的位置,下面看怎么定义特性,定义好的特性怎么用。

    特性的定义,先看下Obsolete特性是怎么定义的。

    可以发现和定义普通的类没有区别,只是继承自Attribute,并且上面有3个特性修饰,分别为

    [Serializable] 一个类可否被序列化,不能被继承;

    [ComVisible(true)]控制程序集中类型或成员对COM的可访问性,不能被继承;

    [AttributeUsage]定义特性适用的范围,能否被继承,可否重复添加等信息,最主要的元元特性,不能被继承。

    //下面这个例子,定义一个特性类,一个普通类(属性应用了定义的特性),获取普通类的所有属性和属性上的特性描述!

    namespace ConsoleApplication1

    {

        [AttributeUsage(AttributeTargets.All, Inherited =true, AllowMultiple =false)]

        public class DescriptionAttribute : Attribute

        {

            private string description;

            private string name;

            private string id;

            public DescriptionAttribute() { }

            public DescriptionAttribute(string description)

            {

                this.description = description;

            }

     

            public string Description

            {

                get

                {

                    if (string.IsNullOrEmpty(this.description))

                    {

                        return "无描述";

                    }

                    return this.description;

                }

            }

     

            public string ID

            {

                get

                {

                    return id;

                }

                set

                {

                    this.id = value;

                }

            }

     

            public string Name

            {

                get

                {

                    return name;

                }

                set

                {

                    this.name = value;

                }

            }

        }

     

     

        class MyClass

        {

            [Description("我的第一个属性", ID ="001", Name ="第一个属性")]

            public string DesOne { get; set; }

     

            [Description(ID = "002", Name = "这个属性没有描述")]

            public string DesTwo { get; set; }

        }

     

        class Program

        {

            static void Main(string[] args)

            {

                Type t = typeof(MyClass);

                PropertyInfo[] properties = t.GetProperties();//获取得到类的所有属性

                Console.WriteLine(t.Name +"类型的属性信息如下:");

     

                foreach (PropertyInfo itemin properties)

                {

                    Console.WriteLine("名称:" + item.Name);

                    Console.WriteLine("类型:" + item.PropertyType);

                    Console.WriteLine("属性:" + item.Attributes);

                    object[] Records = item.GetCustomAttributes(typeof(DescriptionAttribute),false);

                    foreach (DescriptionAttribute recordin Records)

                    {

                        Console.WriteLine("       描述:" + record.Description);

                        Console.WriteLine("       ID:" + record.ID);

                        Console.WriteLine("       Name:" + record.Name);

                    }

                    Console.WriteLine("----------next----------------");

                }

                Console.Read();

            }

        }

    }

    //根据获取属性的方法,备忘下反射经常用的一些知识。

    1.       反射的作用:可以遍历、查看程序集,类型的信息及其成员信息;迟绑定方法、属性;动态创建类型实例,动态调用类型实例的方法、属性、字段等。

    2.       获取Type对象的实例。

    1)使用GetType方法。Type mm ="rxm".GetType();

    2)使用typeof方法。    Type  t = typeof(MyClass);

    3)使用GetType静态方法。Type  tm = Type.GetType("System.String");

    3.       MemberInfo是方法,属性,事件,字段等等Info的基类,我们通过GetMembers()获取的集合,可通过MemberTypes标记的信息进行区分。

    [Flags]
    public enum MemberTypes {
        Constructor = 1,  // 
    该成员是一个构造函数
        Event = 2,        // 该成员是一个事件
        Field = 4,        // 该成员是一个字段
        Method = 8,           // 该成员是一个方法
        Property = 16,    // 该成员是一个属性
        TypeInfo = 32,    // 该成员是一种类型
        Custom = 64,      // 自定义成员类型
        NestedType = 128, // 该成员是一个嵌套类型
        All = 191,        // 指定所有成员类型。
    }

    4.       反射程序集

    System.Reflection命名空间下的Assembly类型,他代表了一个程序集,并包含了程序集的信息。

                Assembly sem = Assembly.LoadFrom(@"E:gongxiangMCS.Library.dll");

                Assembly semT = Assembly.LoadFrom("MCS.Library.dll");

                Assembly semO = Assembly.Load(@"MCS.Library");

                Assembly semN = Assembly.GetExecutingAssembly();//获取当前程序集

                Type t = typeof(MyClass);

            Assembly semMy = t.Assembly; //通过类型实例获取程序集

    获取程序集后,可通过实例的属性、方法等获取自己想要的信息。

     

     

  • 相关阅读:
    嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)
    嵌入式Linux驱动开发之helloword心得
    PJMEDIA之录音器的使用(capture sound to avi file)
    PJMEID学习之视频的捕捉与播放
    PJSIP-PJMEDIA【使用pjmedia 播放wav格式的音乐】
    PJSIP-PJLIB-Socket
    PJSIP-PJLIB(samples) (the usage of the pjlib lib) (eg:string/I/O)
    Start with PJSIP on windows
    Android实际开发之网络请求组件的封装(OkHttp为核心)
    Android实际开发中的首页框架搭建(二、首页框架实现)
  • 原文地址:https://www.cnblogs.com/hometown/p/3204227.html
Copyright © 2020-2023  润新知