#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");
}
}
}