c#中的特性

c#中的特性

特性在我的理解就是在类或者方法或者参数上加上指定的标记,然后实现指定的效果。

和Java中的注解@Annotation类似。

c#内置的特性之Obsolete

[Obsolete("过期了")]
public static void Test()
{
     Console.WriteLine("Test");
}
 
提示警告.png
[Obsolete("过期了",true)]
public static void Test()
{
     Console.WriteLine("Test");
}
 
提示错误.png

c#内置的特性之Conditional

使用方法如下

[Conditional("IsTest")]
public void Test()
{
    Console.WriteLine("Test");       
}
 
如果没有定义IsTest宏的话,方法变成了灰色.png

意思是如果定义了宏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。代码也不知道扔到哪里去了!!所以一定要整理代码,整理总结!!!



作者:六道真君
链接:http://www.jianshu.com/p/93d0b99b52ac
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2017-12-08 10:39  Quintinz  阅读(821)  评论(0编辑  收藏  举报