C#特性Attribute的实际应用之:为应用程序提供多个版本

简介: 基于如下的几个理由,需要为应用程序提供多个版本: 1:应用程序有体验版和完整功能版; 2:应用程序测试过程中需要完成一些自动化的操作; 1:提供体验版 关于第一点,所谓体验版也就是完整版的一个缩小版。

基于如下的几个理由,需要为应用程序提供多个版本:

1:应用程序有体验版和完整功能版;

2:应用程序测试过程中需要完成一些自动化的操作;

1:提供体验版

关于第一点,所谓体验版也就是完整版的一个缩小版。即出于某种理由,不对用户开放应用程序的全部功能。

假设我的应用程序共有两类功能。第一类功能属于单机版,而完整版还提供在线功能。那么,在功能上,我需要定制两个属性"ONLINE"和"OFFLINE"。在体验版中,我只开放"OFFLINE"功能。

要实现此目的,我不想提供两套应用程序,而是想通过最小设置,就能为一个应用程序输出两个发布版本。这个时候,就需要.NET中的特性Attribute了。

首先,我们模拟离线和在线两个功能:

 

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
 
  
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... " ); }

}

程序入口:

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
 
  
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;

1.1:全局宏定义

记住,这个定义一定要在文件的最开头处。同时,该定义只对本文件有效,如果想定义全局,必须在项目属性中定义,如下:

img_5ef8fb150399338a5fa5ec66ebf0fcbe.jpe

如果想定义多个全局宏定义,则用逗号隔开,如"LUMINJI,HUCHANGJUN"。

接下来的问题,就比较简单了,如果要发布全功能,就#define ONLINE,如果要发布离线版功能,就注释掉#define ONLINE然后定义OFFLINE就行了。

2:为测试过程提供自动化操作

在测试UI的时候,需要操作各类文本框、列表等控件。举个简单的例子来说,一个登录窗口,需要输入用户名和密码。如果每次我测试的时候,都要让我自己来输入,势必影响效率。这个时候,就可以让Attribute来发挥作用了。

在如下示例中,在登录窗口的Load事件中,我们为用户名和密码赋值,并模拟点击Click事件。

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
 
  
#define TESTAUTO



using System;



……

public Form1()

{

InitializeComponent();

this .Load += delegate

{

TestAuto();

};

}



[Conditional(
" TESTAUTO " )]

private void TestAuto()

{

Thread t
= new Thread((ThreadStart) delegate

{

Thread.Sleep(
1000 );

this .Invoke((MethodInvoker) delegate

{

this .textBox1.Text = " luminji " ;

this .textBox2.Text = " 123 " ;

button3_Click(
this , null );

});

Thread.Sleep(
1000 );

});

t.IsBackground
= true ;

t.Start();

}


记住,在提交代码的时候,可以注释掉TESTAUTO宏定义,这样,既不会影响到最终的版本,也能让自己在本机得到最大的自由度。从另一个角度来说,整个项目组可提前协调好,可以让这些测试方法共有。

3:关于测试多说一点:

提供一个思路:这个特性也可以让我们从程序员的角度来完成部分测试用例的编写及测试。

后记:

对于Attribute的基础介绍,本文不再阐述,除MSDN外,还可以参考下文(个人感觉这两篇已经写的非常好):

http://blog.csdn.net/fantasiax/archive/2007/05/28/1627694.aspx

http://blog.csdn.net/fantasiax/archive/2007/06/04/1636913.aspx

本文的测试代码下载:http://download.csdn.net/source/2868666

Creative Commons License本文基于 Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 http://www.cnblogs.com/luminji(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
目录
相关文章
|
2月前
|
缓存 Java 数据库连接
扩展类的附加特性
扩展类的附加特性
18 0
|
3月前
|
开发框架 .NET 编译器
总结一下 C# 如何自定义特性 Attribute 并进行应用
总结一下 C# 如何自定义特性 Attribute 并进行应用
Attribute特性的原理
Attribute特性的原理
50 0
c#之Attribute特性的原理
c#之Attribute特性的原理
56 0
|
XML 自然语言处理 JavaScript
SAP UI5 本地开发如何实现 XML 和 JavaScript 代码的自动完成和嵌入式 API 文档自动显示
SAP UI5 本地开发如何实现 XML 和 JavaScript 代码的自动完成和嵌入式 API 文档自动显示
114 0
|
JSON 数据格式
通过一个实际例子,讲解 SAP UI5 Compatibility Version 的概念和运行时绑定解析器的选择逻辑
通过一个实际例子,讲解 SAP UI5 Compatibility Version 的概念和运行时绑定解析器的选择逻辑
123 0