zoukankan      html  css  js  c++  java
  • 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

          这种处理方法,可以在许多方面得到应用。例如在语音卡的事件处理过程中,诸如外拨事件、放音事件及录音事件等操作,在这种过程性的事件响应中,都需要利用反射机制将通道状态来输出。

  • 相关阅读:
    cookie和session的区别和用法
    JavaScript深浅拷贝
    前端知识
    typescript -- ts
    vue笔记精华部分
    宜人贷项目里-----正则匹配input输入月份规则
    PHP-Socket-阻塞与非阻塞,同步与异步概念的理解
    PHP socket客户端长连接
    PHP exec/system启动windows应用程序,执行.bat批处理,执行cmd命令
    查看局域网内所有ip
  • 原文地址:https://www.cnblogs.com/wwwzzg168/p/3567598.html
Copyright © 2011-2022 走看看