現在 你將要創建一個命令句柄的示例。首先,你要用CommandHandler 特性標記類型 ,正如你所看到的,我們習慣性的在附加特性到項目上時,在名字上省略 Attribute:
Now you'll build a sample command handler. First, you tag the type with the CommandHandler attribute. As you see here, it is customary to omit Attribute from the name when attaching an attribute to an item:
[ CommandHandler ]
public class CmdHandler
{
// Implementation coming soon.
}
在CmdHandler 類裡面,你要添加一個屬性來取回命令句柄。這 個屬性應該用DynamicMenu 特性來標記:
[DynamicMenu( "Test Command", "Parent Menu" )]
public EventHandler CmdFunc
{
get
{
if ( theCmdHandler == null )
theCmdHandler = new System.EventHandler
(this.DynamicCommandHandler);
return theCmdHandler;
}
}
private void DynamicCommandHandler(
object sender, EventArgs args )
{
// Contents elided.
}
就是這了。這個例子演 示了你應該如何使用特性來簡化使用反射的程序設計習慣。你可以用一個特性來 標記每個類型,讓它提供一個動態的命令句柄。當你動態的載入這個程序集時, 可以更簡單的發現這個菜單命令句柄。通過應用AttributeTargets (另一個特性 ),你可以限制動態命令句柄應用在什麼地方。這讓從一個動態加載的程序集上 查找類型的困難任務變得很簡單:你確定從很大程度上減少了使用錯誤類型的可 能。這還不是簡單的代碼,但比起不用特性,還算是不錯的。
特性可以 申明運行的意圖。通過使用特性來標記一個元素,可以在運行時指示它的用處以 及簡化查找這個元素的工作。如何沒有特性,你須要定義一些命名轉化,用於在 運行時來查找類型以及元素。任何命名轉化都會是發生錯誤的起源。通過使用特 性來標記你的意圖,就把大量的責任從開發者身上移到了編譯器身上。特性可以 是只能放置在某一特定語言元素上的,特性同樣也是可以加載語法和語義信息的 。
你可以使用反射來創建動態的代碼,這些代碼可以在實際運行中進行 配置。設計和實現特性類,可以強制開發者為申明一些類型,方法,以及屬性, 這些都是可以被動態使用的,而且減少潛在的運行時錯誤。也就是說,讓你增加 了創建讓用戶滿足的應用程序的機會。
返回教程目錄