#define IsTest //定义一个宏 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; using System.Diagnostics; using System.Runtime.CompilerServices; namespace 反射与特性 { class Program { static void Main(string[] args) { MyClass myClass = new MyClass(); //Type type = myClass.GetType();//Type对象只存储类的成员,不存数据 //Console.WriteLine(type.Name); //Console.WriteLine(type.Namespace); //Console.WriteLine(type.Assembly); //FieldInfo[] info = type.GetFields();//只能获取得公有字段,同样还有公有属性以及公有方法 //foreach (FieldInfo info1 in info) //{ // Console.WriteLine(info1.Name); //} //程序集的加载方法一: //Assembly assem = myClass.GetType().Assembly;//先获取一个类的实例,再获取Assembly, //Console.WriteLine(assem.FullName); //程序集的加载方法二:Assembly.Load方法 //Assembly assem = Assembly.Load("反射与特性");//目录下自动搜索 // Type[] types = assem.GetTypes();//遍列assem // foreach (Type t in types) // { // Console.WriteLine(t); // } //示例:Obsolete特性 // myClass.Test1(); //示例:Conditional特性在using System.Diagnostics命名空间中 //标识了此特性的方法,欲调用的话要有引用命名空间Using前启动宏#define IsTest // 方法的代码会编译在程序中,但如果没有启动宏,运行时不会编译方法中的代码 myClass.Test1(); myClass.Test2(); PrintOut("fdfs"); Console.ReadKey(); } //using System.Runtime.CompilerServices命名空间下的[CallerFilePath]获得调用了此方法的程序集的路径名,[CallerLineNumber]获得调用了此方法的第几行,[CallerMemberName]获得调用了此方法的方法名 static void PrintOut(string str,[CallerFilePath]string fileName="",[CallerLineNumber]int linNumber=0,[CallerMemberName]string methodName="") { Console.WriteLine(str); Console.WriteLine(fileName); Console.WriteLine(linNumber); Console.WriteLine(methodName); } } class MyClass { private string name; private int id; public string Number; public string Name { get; set; } [Obsolete("这个方法过时,可以使用Test2代替")]//在调用时提示(弃用的)特性 public void Test1() { Console.WriteLine("Test1"); } [Conditional("IsTest")]//Conditional特性,标识了此特性的方法,欲调用的话要有引用命名空间Using前启动宏#define IsTest public void Test2() { Console.WriteLine("Test2"); } } }