本文档只是自己的学习笔记,可能有误,如果有误请大家帮忙指出,谢谢。
反射和特性
1.反射
Type的常用方法**
Type type =myclass.GetType();//通过GetType方法可以获得对象所属类的type对象
type.Name //获取类的名字
type.Namespace//获取类的命名空间
type.Assembly//获取程序集
type.GetFields//获取类的所有公有字段
type.GetProperties//获取类的所有属性
常用方法案例
得到的最终结果:
2.特性
(1)Obsolete特性
当你想用一个新方法去替代以前的老方法的使用,可以使用Obsolete特性来提示
注意:Obsolete特性需要写在方法前面
// Obsolete 特性
[Obsolete("这个方法被弃用了,请使用NewMethod", true)]//第一个参数用于调用该方法时的信息提示
//第二个参数为true时,调用该方法会报错,若第二个参数不写或为false,则可以继续调用
static void OldMethod()
{
Console.WriteLine("OldMethod");
}
static void NewMethod()
{
Console.WriteLine("NewMethod");
}
static void Main(string[] args)
{
OldMethod();
}
结果:
如果第二个参数为true,则不能调用此方法
如果第二个参数为false 或不写,虽然会提示,但是能继续调用
(2)Conditional特性
当你不想对一个方法再进行调用的时候,你可以为它加上Conditional特性
注意:Conditional特性需要写在方法前面
例1:
//#define isTest
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp28
{
class Program
{
// Conditional特性
[Conditional("isTest")]
static void Test1()
{
Console.WriteLine("Test1");
}
static void Test2()
{
Console.WriteLine("Test2");
}
static void Main(string[] args)
{
Test1();
Test2();
Test1();
Test1();
Console.ReadKey();
}
}
}
结果:
案例分析:
Test1方法前加上了Conditional特性,但是并未定义指定的条件编译符(#define isTest),所以Test1方法不会被调用。只会调用Test2方法
例2:
#define isTest
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp28
{
class Program
{
// Conditional特性
[Conditional("isTest")]
static void Test1()
{
Console.WriteLine("Test1");
}
static void Test2()
{
Console.WriteLine("Test2");
}
static void Main(string[] args)
{
Test1();
Test2();
Test1();
Test1();
Console.ReadKey();
}
}
}
结果:
案例分析:
Test1方法前加上了Conditional特性,也定义了指定的条件编译符(#define isTest),所以Test1方法同样也会被调用。
注意:如果未定义指定的条件编译符,定义方法的语句仍然会被编译,只是调用的语句不被编译
(3)调用者信息特性
注意:加了调用者信息特性的参数必须要有默认值
例:
//调用者信息特性
static void Test([CallerFilePath] string FilePath = "", [CallerLineNumber] int LineNumber = 0,
[CallerMemberName] string MemberName = "")//加了调用者信息特性的参数必须要有默认值
{
Console.WriteLine(FilePath);
Console.WriteLine(LineNumber);
Console.Write(MemberName);
}
static void Main(string[] args)
{
Test();
Console.ReadKey();
}
结果: