特性應該我們大多接觸過,比喻經常使用的[Obsolete],[Serializable]等下面我就主要介紹一個特性的一些用法
摘自MSDN定義:用以將元數據或聲明信息與代碼(程序集、類型、方法、屬性等)相關聯。
意思就是把我們自定義的特性或者微軟自帶的特性和我們的代碼進行組合,其實就是為我們某些代碼附加一些信息
1:先看.Net帶的三種特性
1.1:[Obsolete]這個預定義特性標記了不應被使用的程序實體
- 參數 message,是一個字符串,描述項目過時原因以及特帶的項目。
- 參數 error,是一個布爾值。如果該值為 true,編譯器應把該項目的使用當作一個錯誤。默認值是 false(編譯器生成一個警告)。
[Obsolete("過時方法")] private static void OutModed() { Console.WriteLine("我是過時的方法"); }
然后引用的時候就出現
如果加上false我們發現在引用的使用就沒法編譯過去大家可以自己試驗下
1.2:[Conditional]這個預定義特性指示編譯器應忽略方法調用或屬性,除非已定義指定的條件編譯符號
- 參數 conditionString,獲取與 ConditionalAttribute 屬性相關的條件編譯符號。
private static void Main(string[] args) { Debug(); Trace(); } [Conditional("DEBUG")] private static void Debug() { Console.WriteLine("我是debug"); } [Conditional("TRACE")] public static void Trace() { Console.WriteLine("我是TRACE"); }
當調試成trace模式的時候只能結果:

1.3:[AttributeUsage]描述了如何使用一個自定義特性類。並加上限制
- 參數AttributeTargets 指定可以對它們應用特性的應用程序元素
- 參數allowMultiple 指示該特性是單用還是多用 默認false
- 參數inherited是否可以繼續 默認true
創建一個自定義特性
[AttributeUsage(AttributeTargets.Method)] public class CustomAttribute:Attribute { public string Name { get; set; } public CustomAttribute(string name) { Name = name; } }
上面的限制是只能用於方法
[Custom()]//報錯 internal class Program { private static void Main(string[] args) { }
allowMultiple = false。它規定了特性不能被重復放置多次所以下面代碼會報錯
[Custom("1")] //報錯 [Custom("2")] public void Method() { }
2:自定義特性
先定義一個特性類
[AttributeUsage(AttributeTargets.All,AllowMultiple = true,Inherited = false)] public class CustomAttribute:Attribute { public string Name { get; set; } public int Age { get; set; } public CustomAttribute(string name,int age) { Name = name; Age = age; } }
然后定義一個基類
[Custom("張三", 3)] public class Base { public static void Method() { Console.WriteLine("我具有一個特性"); } }
public static void GetAttributeInfo(Type t) { var myattribute = (CustomAttribute)Attribute.GetCustomAttribute(t, typeof(CustomAttribute)); if (myattribute!=null) { Console.WriteLine("姓名:{0}\n年齡:{1}", myattribute.Name, myattribute.Age); } }
調用
GetAttributeInfo(typeof(Base));

public class Base { [Custom("張三", 3)]//方法上 public static void Method() { Console.WriteLine("我具有一個特性"); } }
就改變t的寫法:t.GetMethod("Method")這樣來獲取特性運行效果一樣
