c#中的特性
特性在我的理解就是在类或者方法或者参数上加上指定的标记,然后实现指定的效果。
和Java中的注解@Annotation类似。
c#内置的特性之Obsolete
[Obsolete("过期了")]
public static void Test()
{
Console.WriteLine("Test");
}
[Obsolete("过期了",true)]
public static void Test()
{
Console.WriteLine("Test");
}
c#内置的特性之Conditional
使用方法如下
[Conditional("IsTest")]
public void Test()
{
Console.WriteLine("Test");
}
意思是如果定义了宏IsTest
则对Test的调用会成功,如果未定义,则该方法的调用不会成功。注意:此时虽然调用不会成功,但是仍然会被编译到程序集中。
c#内置的特性之CallerFilePath,CallerLineNumber,CallerMemberName
这三个特性可以获取调用的所在文件,行数,以及方法名称。猛一看没什么用,但是在打log的时候我觉得还是非常有用的。
static void PrintOut(string message,[CallerFilePath] string fileName="",[CallerLineNumber] int lineNumber=0,[CallerMemberName] string methodName="")
{
Console.WriteLine("message:"+message);
Console.WriteLine("fileName:" + fileName);
Console.WriteLine("lineNumber:" + lineNumber);
Console.WriteLine("methodName:" + methodName);
}
c#内置特性之DebuggerStepThrough,加在方法上
调试的时候假如那个方法确定无误,加上这个特性,调试的时候可以跳过debug的单步调试
c#中自定义一个特性以及获取该特性的属性
定义一个特性
[AttributeUsage(AttributeTargets.Class)] //特性的应用范围
public class MyTestAttribute : System.Attribute
{
public string Description { get; set; }
public string VersionNumber { get; set; }
public int ID { get; set; }
}
将该特性加在类上,这里的特性会自动把Attribute尾去掉
[MyTest(Description = "aaa",ID = 1,VersionNumber = "3")]
public class Program
{
...
}
获取特性的属性
Program p = new Program();
MyTestAttribute attribute = (MyTestAttribute) p.GetType().GetCustomAttribute(typeof (MyTestAttribute)) ;
Console.WriteLine(attribute.Description);
很多用过spring的道友肯定知道注解在Java中的用法,特性在c#中的用法和在Java中是一样的。有时间我会用c#的特性实现一个简单的spring容器,来实现控制反转。以前用java实现过,但是不知道代码扔到哪里去了。还用java实现过简单的orm。代码也不知道扔到哪里去了!!所以一定要整理代码,整理总结!!!