基於如下的幾個理由,需要為應用程序提供多個版本:
1:應用程序有體驗版和完整功能版;
2:應用程序測試過程中需要完成一些自動化的操作;
關於第一點,所謂體驗版也就是完整版的一個縮小版。即出於某種理由,不對用戶開放應用程序的全部功能。
假設我的應用程序共有兩類功能。第一類功能屬於單機版,而完整版還提供在線功能。那麼,在功能上,我需要定制兩個屬性"ONLINE"和"OFFLINE"。在體驗版中,我只開放"OFFLINE"功能。
要實現此目的,我不想提供兩套應用程序,而是想通過最小設置,就能為一個應用程序輸出兩個發布版本。這個時候,就需要.NET中的特性Attribute了。
首先,我們模擬離線和在線兩個功能:
代碼
class MyService
{
[Conditional("OFFLINE")]
[Conditional("ONLINE")]
public static void Testing() { System.Windows.Forms.MessageBox.Show("offline game..."); }
[Conditional("ONLINE")]
public static void GetInfoFromNet() { System.Windows.Forms.MessageBox.Show("online game..."); }
}
程序入口:
代碼
private void button1_Click(object sender, EventArgs e)
{
MyService.Testing();
}
private void button2_Click(object sender, EventArgs e)
{
MyService.GetInfoFromNet();
}
要實現兩個不同的功能,則需要在程序入口這個文件中定義:
#define ONLINE
//#define OFFLINE
using System;
using System.Collections.Generic;
using System.ComponentModel;
記住,這個定義一定要在文件的最開頭處。同時,該定義只對本文件有效,如果想定義全局,必須在項目屬性中定義,如下:
如果想定義多個全局宏定義,則用逗號隔開,如"LUMINJI,HUCHANGJUN"。
接下來的問題,就比較簡單了,如果要發布全功能,就#define ONLINE,如果要發布離線版功能,就注釋掉#define ONLINE,然後定義OFFLINE就行了。
在測試UI的時候,需要操作各類文本框、列表等控件。舉個簡單的例子來說,一個登錄窗口,需要輸入用戶名和密碼。如果每次我測試的時候,都要讓我自己來輸入,勢必影響效率。這個時候,就可以讓Attribute來發揮作用了。
在如下示例中,在登錄窗口的Load事件中,我們為用戶名和密碼賦值,並模擬點擊Click事件。
代碼
#define TESTAUTO
using