以下是学习笔记:
泛型:把类型做到通用,最终目的是可以动态编程
反射:读取DLL文件描述信息的一个类库
特性:贴标签,贴上标签后就产生了新的功能
一,认识特性
特性:1,是一个类。2,继承自Attribute。满足这2个就是特性。
目前哪些地方是使用到了特性:几乎所有的框架都用到了,MVC,WebApi, EF,IOC,AOP
特性使用场景:数据验证,授权
1,数据验证:
举例1:

说明:
[Required]:这个属性不能为空,不输入值就报错
[Disaply(Name=“电子邮件”)]:这个属性自动显示名字:“电子邮件”
举例2:

说明:
[EmailAddress]:验证电子邮件地址
举例3:

说明:
还能指定数据类型
2,授权

说明:
这是一个授权的,标注了这个属性【Authorize】,下面的这个方法才能用。
二,特性分类
1,系统自带特性
[DebuggerStepThrough]:不让调试
[Obsolete]:已过时的
有一些是影响到了编译器的运行
2,自定义的
举例:系统自带的特性
#region 系统自带的特性
[Obsolete("这个方法过时了,使用NewMedthod代替",false)]//Obsolete用来表示一个方法被弃用了,参数1是字符串提示的,参数2,true或false(true是错误,false是警告)
//如果参数2是true ,运行 OldMedthod()就报错啦
static void OldMedthod()
{
Console.WriteLine("旧方法");
}
static void NewMedthod()
{
Console.WriteLine("新方法");
}
[Conditional("IsTest")]//Conditional特性,这个方法不会被调用了。#define IsTest//定义了一个宏,在using前面加这一行,就可以继续使用
static void Test1()
{
Console.WriteLine("test1");
}
static void Test2()
{
Console.WriteLine("test2");
}
[DebuggerStepThrough]//可以掉过debugger的单步调试,不让进入该方法(当我们确定这个方法没有任何错误的时候可以使用这个特性)
static void PrintOut(string str,[CallerFilePath]string fileName="",[CallerLineNumber]int lineNumber=0,[CallerMemberName]string methodName="")
{
Console.WriteLine(str);
Console.WriteLine(fileName);//文件路径
Console.WriteLine(lineNumber);//代码行数
Console.WriteLine(methodName);//调用成员的名称
}
#endregion
三,创建特性

要把DefidAttribute看出是一个普通的类,里面可以写字段,方法,属性,,,
四,特性调用
1,创建特性:
//自定义Attribute
[AttributeUsage(AttributeTargets.Class,AllowMultiple=false,Inherited=false)]
//参数1:可以被哪些情况下使用,如果是All就是被所有情况下都可以用。
//参数2:是否可以放多次
//参数3:是否被继承
public class HelpAttribute:Attribute
{
protected string description;
public HelpAttribute(string description_in)
{
this.description = description_in;
}
public string Description
{
get { return this.description; }
}
}
//调用自定义的Attribute
//[Help("this is a do-nothing class")]//调用特性方法1:
[HelpAttribute("this is a do-nothing class")]//调用特性方法2:写上全称也可以
public class AnyClass
{
}
2,特性调用:
#region 通过反射来获取Attribute中的信息
Console.WriteLine("------------通过反射来获取Attribute中的信息-------------");
HelpAttribute helpAttribute;
foreach (var item in typeof(AnyClass).GetCustomAttributes(true))
{
helpAttribute = item as HelpAttribute;
if (helpAttribute != null)
{
Console.WriteLine("AnyClas Description:{0}", helpAttribute.Description);
}
}
#endregion
结果:AnyClas Description:this is a do-nothing class