C#特性詳解
特性提供功能強大的方法
特性具有以下屬性
特性可向程序中添加元數據
可以將一個或多個特性應用到整個程序集
特性可以與方法和屬性相同的方式接受參數
程序可以使用反射檢查自己的元數據或其他程序內的元數據
這些都是官方的定義
我這麼通俗的解釋下
你注意過程序及編譯的時候的pdb文件了嗎?pdb文件裡面存儲了
下面開始一同學習特性的用法
特性可以放置在幾乎所有的聲明中
[System
public class SampleClass
{
// Objects of this type can be serialized
}
一個聲明上可放置多個特性
using System
…
void MethodA([In][Out] ref double x) { }
void MethodB([Out][In] ref double x) { }
void MethodC([In
某些特性對於給定實體可以指定多次
[Conditional(
void TraceMethod()
{
// …
}
根據約定
特性參數
許多特性都有參數
[DllImport(
[DllImport(
[DllImport(
第一個參數(DLL 名稱)是定位參數並且總是第一個出現
特性目標
特性的目標是應用該特性的實體
若要顯式標識特性目標
[target : attribute
下表顯示了可能的 target 值的列表
C#
適用對象
assembly
整個程序集
module
當前程序集模塊(不同於 Visual Basic 模塊)
field
在類或結構中的字段
event
Event
method
get and set property accessors
param
set property accessor parameters
property
Property
return
get property accessor
type
結構
下面的示例演示如何將特性應用於程序集和模塊
using System;
using System
[assembly: AssemblyTitleAttribute(
[module: CLSCompliant(true)]
下面的示例演示如何在 C# 中將特性應用於方法
// default: applies to method
[SomeAttr]
int Method
// applies to method
[method: SomeAttr]
int Method
// applies to return value
[return: SomeAttr]
int Method
無論規定 SomeAttr 應用於什麼目標
呀
我們這裡拿ObsoleteAttribute做下測試
當然我們看看其他的特性
我們現在用這個構造來驗證
public ObsoleteAttribute(string message
參數 類型
message System ::
error System ::
總之我們在使用特性的時候不要產生畏懼
using System;
namespace 特性
{
class Program
{
static void Main(string[] args)
{
OldClass old = new OldClass()
Console
}
}
[Obsolete(
//第二個參數我這裡設置為true將使用已過時的元素視為錯誤
class OldClass
{
[method: Obsolete(
public void OldMethod()
{
Console
}
}
}
運行以後會出現兩個錯誤提示
好了
自定義特性
通過定義一個特性類
[System
System
]
public class Author : System
{
private string name;
public double version;
public Author(string name)
{
this
version =
}
}
類名是特性的名稱
可以按如下所示使用此新特性
[Author(
class SampleClass
{
// P
}
AttributeUsage 有一個命名參數 AllowMultiple
[System
System
AllowMultiple = true) // multiuse attribute
]
public class Author : System
在下面的代碼示例中
[Author(
[Author(
class SampleClass
{
// P
// R
}
如果特性類包含一個屬性
介紹完了官方的示例是不是還是雲裡霧裡
首先我們從上面可以總結出創建自定義特性的大概步驟
OVER!!!就這麼回事
AttributeUsage特性
public AttributeUsageAttribute( AttributeTargets validOn)
參數 validOn 類型
用指定的 AttributeTargets
於是乎我們返回到了研究AttributeTargets的問題了
原來他是一個枚舉
成員
http://img
Module refers to a portable executable file (
http://img
目前
到了這裡一節也就明了了
按照上面的經驗
? cellPadding=
csharp keyword >using
csharp plain >System;
csharp spaces >
csharp keyword >namespace
csharp plain >特性
csharp plain >{
csharp spaces >
csharp keyword >class
csharp plain >Program
csharp spaces >
csharp plain >{
csharp spaces >
csharp keyword >static
csharp keyword >void
csharp plain >Main(
csharp keyword >string
csharp plain >[] args)
csharp spaces >
csharp plain >{
csharp spaces >
csharp plain >GetAttributeInfo(
csharp keyword >typeof
csharp plain >(OldClass));
csharp spaces >
csharp plain >Console WriteLine(
csharp string > ==============
csharp plain >);
csharp spaces >
csharp plain >GetAttributeInfo(
csharp keyword >typeof
csharp plain >(NewClass));
csharp spaces >
csharp plain >Console ReadKey();
csharp spaces >
csharp plain >}
csharp spaces >
csharp keyword >public
csharp keyword >static
csharp keyword >void
csharp plain >GetAttributeInfo(Type t)
csharp spaces >
csharp plain >{
csharp spaces >
csharp plain >OldAttribute myattribute = (OldAttribute)Attribute GetCustomAttribute(t
csharp keyword >typeof
csharp plain >(OldAttribute));
csharp spaces >
csharp keyword >if
csharp plain >(myattribute ==
csharp keyword >null
csharp plain >)
csharp spaces >
csharp plain >{
csharp spaces >
csharp plain >Console WriteLine(t ToString()+
csharp string > 類中自定義特性不存在!
csharp plain >);
csharp spaces >
csharp plain >}
csharp spaces >
csharp keyword >else
csharp spaces >
csharp plain >{
csharp spaces >
csharp plain >Console WriteLine(
csharp string > 特性描述:{ }\n加入事件{ }
csharp plain > myattribute Discretion myattribute date);
csharp spaces >
csharp plain >}
csharp spaces >
csharp plain >}
csharp spaces >
csharp plain >}
csharp spaces >
csharp spaces >
csharp plain >[AttributeUsage(AttributeTargets Class Inherited=
csharp keyword >false
csharp plain >)]
csharp comments >//設置了定位參數和命名參數
csharp spaces >
csharp spaces >
csharp comments >//該特性適用於所有的類 而且是非繼承的
csharp spaces >
csharp keyword >class
csharp plain >OldAttribute : Attribute
csharp comments >//繼承自Attribute
csharp spaces >
csharp plain >{
csharp spaces >
csharp keyword >private
csharp keyword >string
csharp plain >discretion;
csharp spaces >
csharp spaces >
csharp keyword >public
csharp keyword >string
csharp plain >Discretion
csharp spaces >
csharp plain >{
csharp spaces >
csharp keyword >get
csharp plain >{
csharp keyword >return
csharp plain >discretion; }
csharp spaces >
csharp keyword >set
csharp plain >{ discretion = value; }
csharp spaces >
csharp plain >}
csharp spaces >
csharp keyword >public
csharp plain >DateTime date;
csharp spaces >
csharp keyword >public
csharp plain >OldAttribute(
csharp keyword >string
csharp plain >discretion)
csharp spaces >
csharp plain >{
csharp spaces >
csharp keyword >this
csharp plain > discretion = discretion;
csharp spaces >
csharp plain >date = DateTime Now;
csharp spaces >
csharp plain >}
csharp spaces >
csharp plain >}
csharp spaces >
csharp comments >//現在我們定義兩類
csharp spaces >
csharp plain >[Old(
csharp string > 這個類將過期
csharp plain >)]
csharp comments >//使用定義的新特性
csharp spaces >
csharp keyword >class
csharp plain >OldClass
csharp spaces >
csharp plain >{
csharp spaces >
csharp keyword >public
csharp keyword >void
csharp plain >OldTest()
csharp spaces >
csharp plain >{
csharp spaces >
csharp plain >Console WriteLine(
csharp string > 測試特性
csharp plain >);
csharp spaces >
csharp plain >}
csharp spaces >
csharp plain >}
csharp spaces >
csharp keyword >class
csharp plain >NewClass:OldClass
csharp spaces >
csharp plain >{
csharp spaces >
csharp keyword >public
csharp keyword >void
csharp plain >NewTest()
csharp spaces >
csharp plain >{
csharp spaces >
csharp plain >Console WriteLine(
csharp string > 測試特性的繼承
csharp plain >);
csharp spaces >
csharp plain >}
csharp spaces >
csharp plain >}
csharp spaces >
csharp comments >//我們寫一個方法用來獲取特性信息
csharp plain >}
運行效果
From:http://tw.wingwit.com/Article/program/net/201311/12800.html