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

简介:

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

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

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

1:提供体验版

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

假设我的应用程序共有两类功能。第一类功能属于单机版,而完整版还提供在线功能。那么,在功能上,我需要定制两个属性"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;
复制代码

1.1:全局宏定义

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

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

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

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

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

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

复制代码
代码

   
   
#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:关于测试多说一点:

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


本文转自最课程陆敏技博客园博客,原文链接:http://www.cnblogs.com/luminji/archive/2010/11/30/1891692.html,如需转载请自行联系原作者

相关文章
|
10月前
|
存储 监控 算法
基于 C# 时间轮算法的控制局域网上网时间与实践应用
在数字化办公与教育环境中,局域网作为内部网络通信的核心基础设施,其精细化管理水平直接影响网络资源的合理配置与使用效能。对局域网用户上网时间的有效管控,已成为企业、教育机构等组织的重要管理需求。这一需求不仅旨在提升员工工作效率、规范学生网络使用行为,更是优化网络带宽资源分配的关键举措。时间轮算法作为一种经典的定时任务管理机制,在局域网用户上网时间管控场景中展现出显著的技术优势。本文将系统阐述时间轮算法的核心原理,并基于 C# 编程语言提供具体实现方案,以期深入剖析该算法在局域网管理中的应用逻辑与实践价值。
249 5
|
编译器 C# 开发者
C# 9.0 新特性解析
C# 9.0 是微软在2020年11月随.NET 5.0发布的重大更新,带来了一系列新特性和改进,如记录类型、初始化器增强、顶级语句、模式匹配增强、目标类型的新表达式、属性模式和空值处理操作符等,旨在提升开发效率和代码可读性。本文将详细介绍这些新特性,并提供代码示例和常见问题解答。
364 7
C# 9.0 新特性解析
|
存储 安全 物联网
C# 在物联网 (IoT) 应用中的应用
本文介绍了C#在物联网(IoT)应用中的应用,涵盖基础概念、优势、常见问题及其解决方法。重点讨论了网络通信、数据处理和安全问题,并提供了相应的代码示例,旨在帮助开发者更好地利用C#进行IoT开发。
670 3
|
C# 开发者
C# 10.0 新特性解析
C# 10.0 在性能、可读性和开发效率方面进行了多项增强。本文介绍了文件范围的命名空间、记录结构体、只读结构体、局部函数的递归优化、改进的模式匹配和 lambda 表达式等新特性,并通过代码示例帮助理解这些特性。
302 2
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
354 2
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
296 0
|
6月前
|
XML 前端开发 C#
C#编程实践:解析HTML文档并执行元素匹配
通过上述步骤,可以在C#中有效地解析HTML文档并执行元素匹配。HtmlAgilityPack提供了一个强大而灵活的工具集,可以处理各种HTML解析任务。
320 19
|
7月前
|
监控 算法 C#
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
1325 0
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
347 3
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
1157 12