特性應該我們大多接觸過,比喻經常使用的[Obsolete],[Serializable]等下面我就主要介紹一個特性的一些用法
摘自MSDN定義:用以將元數據或聲明信息與代碼(程序集、類型、方法、屬性等)相關聯。
意思就是把我們自定義的特性或者微軟自帶的特性和我們的代碼進行組合,其實就是為我們某些代碼附加一些信息
1.1:[Obsolete]這個預定義特性標記了不應被使用的程序實體
[Obsolete("過時方法")] PRivate static void OutModed() { Console.WriteLine("我是過時的方法"); }
然后引用的時候就出現
如果加上false我們發現在引用的使用就沒法編譯過去大家可以自己試驗下
1.2:[Conditional]這個預定義特性指示編譯器應忽略方法調用或屬性,除非已定義指定的條件編譯符號
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]描述了如何使用一個自定義特性類。并加上限制
創建一個自定義特性
[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() { }
先定義一個特性類
[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")這樣來獲取特性運行效果一樣
新聞熱點
疑難解答