特性
特性(conditional)是一个类
是一个继承了Attribute的类
给程序添加的声明性标签
.Net 提供了两种特性:预定义特性 自定义特性
预定义特性 : 三种
1.条件方法 : 只有在预编译指令和conditional的条件一样时,才会执行方法
#define AAA
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
namespace 特性
{
class Program
{
static void Main(string[] args)
{
myFun();
}
//预定义特性
//条件方法:使用Conditional添加条件
[Conditional("AAA")]
private static void myFun()
{
Console.WriteLine("特性AAA");
}
}
}
2.标记不被使用的程序体
此时调用此方法,也能用但是会有绿色波浪线,表示已过时
[Obsolete()]
private static void OldFun()
{
}
此时就不能调用
[Obsolete("请使用新的方法", true)]
private static void OldFun()
{
}
3.AttributeUsage特性用来限制自定义特性能用在什么地方
是否可以重复添加,此特性是否可以被继承
[AttributeUsage(AttributeTargets.All,AllowMultiple = true,Inherited =true)]
自定义特性时,最后一个单词默认为Attribute,使用时会自动省略
5.想获得特性,需要用到反射
程序集
Assmbly类来加载程序集
通过Assmbly.Load()
Assmbly.LoadFrom()等获取程序集的dll
反射
反射:审查程序集内部元数据的能力
1.三种通过反射获得Type对象的方法
1)通过Type的staticMethod GetType()方法,参数为目标类型的全名
2)通过对象的GetType函数获得
3)使用typeOf运算符获得,参数为目标类
2.创建对象:通过调用构造函数创建对象
1)通过反射创建对象,首先获得构造函数的ConstructorInfo对象,再通过Invoke创建对象。
//2.创建对象:通过调用构造函数创建的对象
//要通过反射创建对象,就得获取到Person的构造函数
//获取到Person对象的所有公开构造函数
ConstructorInfo[] cons = typeA.GetConstructors();
//遍历cons获取单个构造函数的参数信息(个数、顺序、类型)
foreach (var item in cons)
{
Console.WriteLine("有一个构造函数的参数信息全部被打印出来了");
//获取单个构造函数的所有参数
ParameterInfo[] paras = item.GetParameters();
//遍历单个构造函数的所有参数数组
for (int i = 0; i < paras.Length; i++)
{
Console.WriteLine("第" + i + "个参数的类型为:" + paras[i].ParameterType);
}
Console.WriteLine("------------------------------------------------------");
}
//通过获取到的构造函数信息,获取单个构造函数
Type[] types = { typeof(int) };
//获取到的就是只有一个int类型参数的构造函数
ConstructorInfo con = typeA.GetConstructor(types);
//调用con创建Person对象
object o = con.Invoke(new object[] { 15 });
3.通过反射获取字段
1)FieldInfo存储type对象的GetFields();
2)MethofInfo获取对象的方法