1. 程式人生 > >c#中的特性

c#中的特性

test 獲得 () format attribute let orm 自定義 alt

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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。

c#中的特性