在设计程序时,无论是界面或是后台代码,我们通常都想留给用户一个较为简单的接口。而我在参与封装语音卡开发函数包的时候,发现各种语音卡的底层函数的接口都是各种整形变量标记值,使用起来极为不变。于是就理解了前辈所写的代码中,利用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文件构建反射表机制的更多相关文章

  1. 利用sfc文件构建网络渗透

      收集哈希 SCF(Shell命令文件)文件可用于执行一组有限的操作,例如显示Windows桌面或打开Windows资源管理器,这并不是什么新鲜事.然而,一个SCF文件可以用来访问一个特定的UNC路 ...

  2. Android通过xml文件配置数据库

    之前一段时间自己封装了两个数据库,一个是ORM数据库,另一个是事件流数据库,项目相应的地址如下: ORM数据库:https://github.com/wenjiang/SimpleAndroidORM ...

  3. ANT build.xml文件详解

    Ant的优点 跨平台性.Ant是用Java语言编写的,所示具有很好的跨平台性. 操作简单.Ant是由一个内置任务和可选任务组成的. Ant运行时需要一个XML文件(构建文件). Ant通过调用targ ...

  4. [置顶] ANT build.xml文件详解

    Ant的优点 跨平台性.Ant是用Java语言编写的,所示具有很好的跨平台性. 操作简单.Ant是由一个内置任务和可选任务组成的. Ant运行时需要一个XML文件(构建文件). Ant通过调用targ ...

  5. 解析xml文件的四种方式

    什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没 ...

  6. python读取/创建XML文件

    Python中定义了很多处理XML的函数,如xml.dom,它会在处理文件之前,将根据xml文件构建的树状数据存在内存.还有xml.sax,它实现了SAX API,这个模块牺牲了便捷性,换取了速度和减 ...

  7. 跨域策略文件crossdomain.xml文件

    使用crossdomain.xml让Flash可以跨域传输数据 一.crossdomain.xml文件的作用    跨域,顾名思义就是需要的资源不在自己的域服务器上,需要访问其他域服务器.跨域策略文件 ...

  8. 关于跨域策略文件crossdomain.xml文件--配置实例

    转载自:http://bbs.phpchina.com/blog-52440-191623.html 我一直不太明白crossdomain.xml文件是干嘛用的,今天总算比较清楚的知道了一下. 这是F ...

  9. IOS的XML文件解析,利用了NSData和NSFileHandle

    如果需要了解关于文档对象模型和XML的介绍,参看 http://www.cnblogs.com/xinchrome/p/4890723.html 读取XML 上代码: NSFileHandle *fi ...

随机推荐

  1. ESLint可共享配置发布,团队自定义ESLint规则新鲜出炉

    ESLint于2013年6月份推出,至今4个年头,最新版本v4.8.0.它是目前主流的用于Javascript和JSX代码规范检查的利器,很多大公司比如Airbnb和Google均有一套自己的Java ...

  2. HDU1251统计难题(水字典树)

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Subm ...

  3. curl命令用于模拟http浏览器发起动作

    1.模拟http浏览器发起访问百度首页的动作 curl  http://www.baidu.com 2.也可以模拟http浏览器发起POST动作,这个在测试后端程序时非常常见.

  4. OpenCV中的绘图函数-OpenCV步步精深

    OpenCV 中的绘图函数 画线 首先要为画的线创造出环境,就要生成一个空的黑底图像 img=np.zeros((512,512,3), np.uint8) 这是黑色的底,我们的画布,我把窗口名叫做i ...

  5. Github Page--CSDN新人的第二选择

    我也是个CSDN新人,使用的CSDN的初衷应该和众人类似,就是想总结下平时的学习成果,或者一些想法. CSDN好的地方: 书写界面简洁,支持markdown语法 人还算多,也比较年轻 相对较活跃 内容 ...

  6. 九大排序算法Demo

    1. 冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换, ...

  7. uva 10118,记忆化搜索

    这个题debug了长达3个小时,acm我不能放弃,我又回来了的第一题! 一开始思路正确,写法不行,结果越改越乱 看了网上某神的代码,学习了一下 coding+debug:4小时左右,记忆化搜索+dp类 ...

  8. flask + wtform + google storage

    项目需要使用 flask 上传.下载文件到 google storage 上, 搜了一圈没有能直接结合 wtform 使用的插件,所以动手造了个轮子. 只实现了基本的上传,下载的功能,后续可能会完善预 ...

  9. (转)UML实践详细经典教程----用例图、顺序图、状态图、类图、包图、协作图

    原文链接:http://dn.codegear.com/article/31863 面向对象的问题的处理的关键是建模问题.建模可以把在复杂世界的许多重要的细节给抽象出.许多建模工具封装了UML(也就是 ...

  10. 12.21-Android ServerSocket

    建立ServerSocket服务器 1.new ServerSocket对象servierSocket 2.接收客户端请求Socket client = servierSocket.accept(); ...