反射(一)

来源:互联网 发布:阿里云服务器克隆 编辑:程序博客网 时间:2024/05/16 08:41

 [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:\gongxiang\MCS.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; //通过类型实例获取程序集

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