预定义类型(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]  可以被序列化

表明一个字段可以被存储