C#配合利用XML文件构建反射表机制
在设计程序时,无论是界面或是后台代码,我们通常都想留给用户一个较为简单的接口。而我在参与封装语音卡开发函数包的时候,发现各种语音卡的底层函数的接口都是各种整形变量标记值,使用起来极为不变。于是就理解了前辈所写的代码中,利用XML构建反射表机制的初衷。下面我就以某一种语音卡所能兼容的语音格式为例,将反射表机制的原理做个示范。
语音卡的底层开发函数中,放音和录音函数的参数都是很多而且不易理解和记忆的。以语音格式为例,假如a率的标记值是6,u率的标记值是7,……,一般所能兼容的语音格式为10多个。如果我们选用整形变量来做标记语音格式的参数,那么我们大概就有两种选择:1.要么我们把这种对应关系生记下来,2.要么我们在调用函数时去查一下对照表,而这两种方式,都需要做不必要的投入。
这时反射表的优势就表现出来了,下面看看例子:
//先做一个语音格式的枚举,方便用户调用:
enum 语音格式
{
未定义 = -1,
a率 = 0,
u率 = 1,
PCM16 = 2,
PCM8 = 3,
GSM = 4,
ADPCM = 5,
VOX = 6,
MP3 = 7,
G729 = 8,
G723 = 9,
GC8 = 10,
}
//这是一个语音格式类,用于填充语音格式对照表
class PhoneticMatrix
{
XmlNodeList nodeList = null;
XmlNode node=null;
//填充语音格式对照表
public readonly Dictionary<语音格式, int> 语音格式对照表 = new Dictionary<语音格式, int>();
public void FillDirectory(string 配置文件名)
{
XmlDocument xDoc = new XmlDocument();
xDoc.Load(配置文件名);
//选择格式“结点”列表
nodeList = xDoc.SelectNodes("/语音格式/格式");
foreach(XmlNode nodes in nodeList)
{
//选取结点“名称”,并读取结点值
node=nodes.SelectSingleNode("名称");
string s名称=node.FirstChild.Value;
//选取结点“编号”,并读取结点值
node = nodes.SelectSingleNode("编号");
string s编号 = node.FirstChild.Value;
int i编号 = int.Parse(s编号);
//填充语音格式对照表
语音格式 当前语音格式 = (语音格式)Enum.Parse(typeof(语音格式), s名称);
语音格式对照表.Add(当前语音格式, i编号);
}
}
//编写一个方法,用来演示语音格式对照表的使用,具体使用方法类似但要视情况而定
//显示所选取的语音格式的配置编号
public int ShowFormatID(语音格式 用户选项)
{
int i语音格式编号;
//查询选定的枚举项所对应的配置值
语音格式对照表.TryGetValue(用户选项, out i语音格式编号);
Console.WriteLine("用户选定项:"+用户选项.ToString()+";该选项所对应的配置值为:"+i语音格式编号.ToString());
return i语音格式编号;
}
//最后贴出测试用的Main函数
class Program
{
static void Main(string[] args)
{
//获取当前工作目录
string dir = Directory.GetCurrentDirectory();
//生成文件路径
string actualDir = dir + "\\语音格式.xml";
PhoneticMatrix pm = new PhoneticMatrix();
pm.FillDirectory(actualDir);
int i格式编号 = pm.ShowFormatID(语音格式.a率);
Console.ReadLine();
}
}
//最后给出测试用的XML文件:
<?xml version="1.0" encoding="utf-8" ?>
<语音格式>
<格式>
<名称>a率</名称>
<编号>6</编号>
</格式>
<格式>
<名称>u率</名称>
<编号>7</编号>
</格式>
<格式>
<名称>GSM</名称>
<编号>49</编号>
</格式>
<格式>
<名称>ADPCM</名称>
<编号>17</编号>
</格式>
<格式>
<名称>VOX</名称>
<编号>23</编号>
</格式>
<格式>
<名称>MP3</名称>
<编号>85</编号>
</格式>
<格式>
<名称>G729</名称>
<编号>65411</编号>
</格式>
<格式>
<名称>G723</名称>
<编号>0</编号>
</格式>
<格式>
<名称>PCM16</名称>
<编号>-2</编号>
</格式>
<格式>
<名称>PCM8</名称>
<编号>1</编号>
</格式>
<格式>
<名称>GC8</名称>
<编号>131</编号>
</格式>
<格式>
<名称>未定义</名称>
<编号>-1</编号>
</格式>
</语音格式>
//输出结果:
用户选定项:a率;该选项的配置值为:6
这种处理方法,可以在许多方面得到应用。例如在语音卡的事件处理过程中,诸如外拨事件、放音事件及录音事件等操作,在这种过程性的事件响应中,都需要利用反射机制将通道状态来输出。
C#配合利用XML文件构建反射表机制的更多相关文章
- 利用sfc文件构建网络渗透
收集哈希 SCF(Shell命令文件)文件可用于执行一组有限的操作,例如显示Windows桌面或打开Windows资源管理器,这并不是什么新鲜事.然而,一个SCF文件可以用来访问一个特定的UNC路 ...
- Android通过xml文件配置数据库
之前一段时间自己封装了两个数据库,一个是ORM数据库,另一个是事件流数据库,项目相应的地址如下: ORM数据库:https://github.com/wenjiang/SimpleAndroidORM ...
- ANT build.xml文件详解
Ant的优点 跨平台性.Ant是用Java语言编写的,所示具有很好的跨平台性. 操作简单.Ant是由一个内置任务和可选任务组成的. Ant运行时需要一个XML文件(构建文件). Ant通过调用targ ...
- [置顶] ANT build.xml文件详解
Ant的优点 跨平台性.Ant是用Java语言编写的,所示具有很好的跨平台性. 操作简单.Ant是由一个内置任务和可选任务组成的. Ant运行时需要一个XML文件(构建文件). Ant通过调用targ ...
- 解析xml文件的四种方式
什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没 ...
- python读取/创建XML文件
Python中定义了很多处理XML的函数,如xml.dom,它会在处理文件之前,将根据xml文件构建的树状数据存在内存.还有xml.sax,它实现了SAX API,这个模块牺牲了便捷性,换取了速度和减 ...
- 跨域策略文件crossdomain.xml文件
使用crossdomain.xml让Flash可以跨域传输数据 一.crossdomain.xml文件的作用 跨域,顾名思义就是需要的资源不在自己的域服务器上,需要访问其他域服务器.跨域策略文件 ...
- 关于跨域策略文件crossdomain.xml文件--配置实例
转载自:http://bbs.phpchina.com/blog-52440-191623.html 我一直不太明白crossdomain.xml文件是干嘛用的,今天总算比较清楚的知道了一下. 这是F ...
- IOS的XML文件解析,利用了NSData和NSFileHandle
如果需要了解关于文档对象模型和XML的介绍,参看 http://www.cnblogs.com/xinchrome/p/4890723.html 读取XML 上代码: NSFileHandle *fi ...
随机推荐
- 闲聊DOS命令
使用DOS命令进入指定文件夹打开文本文件: 回车确定 先进入F盘: 回车后输入: F: 然后回车就进入了F盘,如下图: 然后比如我们要打开 F:\电脑桌面文件\hosts文件.txt文件,打开步骤如 ...
- FPGA在其他领域的应用(一)
测试和测量应用: 测试需要是所有细分市场的要求.无论是终端市场,所有产品在运到最终客户之前都必须进行测试.这动态地驱动测试和测量领域的普遍性质,其中包括下面的种类和分段: 通信测试: 无线测试仪 (W ...
- webpack2使用ch2-entry和output简要说明
1 entry打包入口 打包字符串和数组 const webpack = require('webpack'), path = require('path'); module.exports = { ...
- 项目常用Javascript分享,包含常用验证和Cookie操作
function IsEmail(str) { var r = /^[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/; if (r.test(str)) ...
- Collection和Map的默认扩容参数
初始大小:调用无参构造函数时默认的容量 加载因子:超过 (当前容量*加载因子) 时会进行扩容 扩容因子:扩容时增加的容量为 (当前容量*扩容因子) 容器 初始容量 ...
- Django 模型中自定义Manager和模型方法
1.自定义管理器(Manager) 在语句Book.objects.all()中,objects是一个特殊的属性,通过它来查询数据库,它就是模型的一个Manager. 每个Django模型至少有一个m ...
- commonjs模块和es6模块的区别
commonjs模块与es6模块的区别 到目前为止,已经实习了3个月的时间了.最近在面试,在面试题里面有题目涉及到模块循环加载的知识.趁着这个机会,将commonjs模块与es6模块之间一些重要的的区 ...
- 张高兴的 Windows 10 IoT 开发笔记:HC-SR04 超声波测距模块
HC-SR04 采用 IO 触发测距.下面介绍一下其在 Windows 10 IoT Core 环境下的用法. 项目运行在 Raspberry Pi 2/3 上,使用 C# 进行编码. 1. 准备 H ...
- visio移动形状 上下左右键 移动滚动条
今天在用visio写作业,想微移visio的形状,于是按上下左右方向键,结果移动的是滚动条. 那么如何让visio按上下左右移动的是形状,其实按Scroll键就好了.
- java中 n-- 和 --n的区别
n--和--n的最终结果都是将n本身减一,区别是现在的值: 比如说: n=10 a=n;此时a=10 b=n--;此时b=10,n=9减号放后面是指先赋值,再自减1 c=--n;此时c=8,n=8减号 ...