c# 反射和特性

来源:互联网 发布:网络优化工程师好学不 编辑:程序博客网 时间:2024/05/21 10:40

预定义类型(int long 和 string等),BCL中(Console, IEnumerable等)和程序员自定义类型,每种类型都有自己的成员和特性

BCL声明了一个叫做TYPE的抽象类,它被设计用来包含类型的特征

使用这个对象能让我们获取程序使用的对象信息

由于Type是抽象类,因此不能用它去实例化对象,关于Type的实例化对象

一个类中的方法和字段可以用Type显示出来,并且只能获取公有的字段


基本用法:

using System.Reflection;

FieldInfo[] array = type.GetFields();
            foreach(var a in array)
            {
                Console.WriteLine(a);   获取所有公有字段
            }


            PropertyInfo[] array2 = type.GetProperties();
            foreach(var info in array2)
            {
                Console.WriteLine(info.Name + "   ");  获取所有公有属性
            }


            var array3 = type.GetMethods();
            foreach(var method in array3)
            {
                Console.WriteLine(method.Name + "  ");  获取所有公有函数
            }


获取程序所在程序集:

Assembly类在System.Reflection命名空间中的定义.它允许访问给定程序集的元数据,它也包含了可以加载和执行的程序集

Myclass my = new Myclass();
            Assembly assem = my.GetType().Assembly; //
            Console.WriteLine(assem.FullName);
            Type[] types = assem.GetTypes();


            foreach(var type in types)
            {
                Console.WriteLine(type);
            }


常用特性特性:

[obsolete]特性:标注这个方法已经过期了 建议使用新的方法

 [Obsolete("这个方法已经过时了,建议使用新方法", true)]  //加上true时 旧方法无法使用
        static void OldMethod()
        {
            Console.WriteLine("This is an old method");
        }


        static void NewMethod()
        {
            Console.WriteLine("This is a new method");
        }


[Condition]特性:必须定义了宏后才能被调用

using System.Diagnostics;

[Conditional("IsText")]   //必须使用define来定义
        static void NewMethod()
        {
            Console.WriteLine("This is a new method");
        }


此时必须定义相应宏后才能使用该函数: #define IsText


调用者信息特性:

using System.Runtime.CompilerServices;

static void PrintOut(string str, [CallerFilePath]string filepath="", [CallerLineNumber]int LineNumber=0, [CallerMemberName]string MemberName="")
        {
            Console.WriteLine(filepath);
            Console.WriteLine(LineNumber);
            Console.WriteLine(MemberName);
        }

此时输出的时 可执行文件位置, 代码行数 和所执行的函数名


跳过调试特性

 [DebuggerStepThrough]

当一个函数100%正确时 调用该特性 则编译器不会进入该函数进行调试

[Serializable]  可以被序列化

表明一个字段可以被存储


原创粉丝点击