学习LabVIEW(二)——操作.NET泛型类

发布者:快乐旅人最新更新时间:2015-08-20 来源: eefocus关键字:LabVIEW  NET  泛型类 手机看文章 扫描二维码
随时随地手机看文章
    误入歧途的一天。昨天晚上我看见http://digital.ni.com/public.nsf/allkb/DC41DCDA972642CF8625787E00732DDD说LabVIEW不支持.NET的泛型,如果要用,可以用C#写一个包装类。我就不信邪了,即使LabVIEW的语言层面不支持,我们也可以用.NET框架提供的Reflection的能力来实现任何我们想要实现的目标吧,用不着大动干戈写C#代码。于是我今天就试了试,最后发现,还是写C#代码来得比较方便,尽管我们用纯LabVIEW实现了泛型类的操作。
    用Reflection这样的机制操作泛型类,首先需要对.NET框架的基本对象模型有些了解。.NET的对象模型和CPython的对象模型有许多共通之处,比如,对象实例会包含一个执行类型对象的指针,这就是可以在运行时获取对象类型信息的基石。这里有一个非常重要的概念,就是类型对象,所谓类型对象就是代表类型的对象,这一点和CPython的对象模型简直不能更像,类型也是对象。知道了这一点,问题就好解决了。首先构造泛型类填充类型之后的类的对象,再由类对象来生成类实例。
    我们挑选System.Collections.Generic.Dictionary作为实验对象。这个泛型类我们需要填充两个类型参数,一个是Key的类型,一个是Value的类型。
    首先,获取没有填充类型参数的Dictionary类对象。类对象可以使用
System.Type.GetType("类名")
这种方式获取。然而,没有填充类型的Dictionary的名字是什么呢?在页面https://msdn.microsoft.com/zh-cn/library/system.type.makegenerictype(v=vs.100).aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-3中C++的例子我们就能发现它的名字是System.Collections.Generic.Dictionary`2。
学习LabVIEW(二)——操作.NET泛型类

上图有一点需要注意。“调用节点”不仅可以调用普通的方法,也可以调用类的静态方法。具体做法就是类实例的输入端口什么也不接,然后在节点的右键菜单中选择相应的类名。类型选择的时候要注意,如果要用System.String, System.Int32, 以及System.Type这些类型时,要去mscorlib中找,选择器列出来的项目中没有这些,如下图所示:
学习LabVIEW(二)——操作.NET泛型类

    现在我们得到了没有填充类型参数的Dictionary,如何在没有语言支持的情况下填充参数呢(C#等.NET语言提供了语言支持可以用诸如Dictionary这样的语法)?答案就是MakeGenericType。类型对象的MakeGenericType方法的参数为Type[],数组中的类型对象将用来填充泛型类的类型参数,返回填充之后的具体类型。
    为了构造一个Type[],我一开始用的方法是System.Array的CreateInstance,但是发现它在LabVIEW中不能转换成Type[],因此也无法传递给MakeGenericType。最后找到的解决办法是使用LabVIEW自带的数组类型,往里面添加.NET的类型对象即可,LabVIEW会自动把它转化成Type[],如下图所示:
学习LabVIEW(二)——操作.NET泛型类

上面的程序最终生成了一个
System.Collections.Generic.Dictionary
的实例。
    有了一个类型对象,如何生成类的实例?答案是System.Activator。把生成的类型对象作为参数传递给Activator的静态方法CreateInstance,我们即可得到类的实例,如下图所示:
学习LabVIEW(二)——操作.NET泛型类
    上面的实验就像一场诗情画意的旅行,然而别高兴得太早,真正的噩梦从现在才开始。通过CreateInstance生成的
System.Collections.Generic.Dictionary
的实例会被当成System.Object,这是由CreateInstance返回值类型决定的。在C#中,我们可以用一个强制类型转换,把它转换成Dictionary,可是LabVIEW中似乎做不到这一点,即使提供了“类型转换”节点,然而并不能作我们需要的转换。
    LabVIEW把我们的Dictionary当做Object,我们无法使用“调用”节点来调用Dictionary的方法了。这个问题怎么解决?答案就是Reflection,利用类型对象的GetMethod方法获取MethodInfo,再通过MethodInfo的Invoke方法实现方法的调用。真正麻烦之处在于,Invoke需要传入一个System.Object[],作为调用方法的参数。因此,为了调用方法,我们还需要首先构造这个参数列表。[page]
    首先调用Dictionary的Add方法,往里面添加一个Key-Value对。根据Dictionary这个类型,Add方法的参数为一个字符串和一个整数。和前面调用MakeGenericType一样,我们还是用LabVIEW自带的数组来构造Invoke所需要的Object[]。糟糕的一点在于,LabVIEW没法自动把自身的字符串和整数类型转换成.NET的System.Object,我们需要借助dotnet.llb这个库,可以在LabVIEW的安装目录中找到,比如,我的机器上是这个路径:
.../LabVIEW2013/vi.lib/Platform/dotnet.llb
在当前的程序中点右键,在弹出的菜单中点击“选择vi“,会弹出一个打开文件对话框,用这个对话框打开上面说到的dotnet.llb,如下图所示:
学习LabVIEW(二)——操作.NET泛型类

选择之后,会弹出另外一个对话框,选中“To .NET Object.vi”即可,如下图所示。
学习LabVIEW(二)——操作.NET泛型类

最后用如下的方法成功调用了Dictionary的Add方法:
学习LabVIEW(二)——操作.NET泛型类

上面的程序中,我们插入的Key-Value对为
"eleven" : 11
    接下来,我们用Dictionary的TryGetValue方法获取Key "eleven"对应的Value。TryGetValue的返回值为bool型,表示查询是否成功,第一个参数为Key,第二个参数为传出参数,为查询得到的Value。和刚才一样,通过GetMethod和Invoke来调用TryGetValue,构造Object[]作为参数列表。需要注意的是,Object[]的第二个参数需要和Value的类型保持一致,否则会报错。程序如下:
学习LabVIEW(二)——操作.NET泛型类
程序中用了两个文本框输出TryGetValue的返回值和传出参数。查询时用的Key是字符串"eleven",第二个参数5是随便写的,只要是和Value类型相同即可。所以得到下面的运行结果也在意料之中:
学习LabVIEW(二)——操作.NET泛型类

经过了上面这一番实验,原本认为在LabVIEW中利用Reflection就可以轻易操纵泛型的我,还是默默启动了Visual Studio,写起了C#代码。
关键字:LabVIEW  NET  泛型类 引用地址:学习LabVIEW(二)——操作.NET泛型类

上一篇:学习LabVIEW(三)——观念的转变
下一篇:学习LabVIEW(一)——调用ZXing.NET

推荐阅读最新更新时间:2024-03-30 23:03

NetApp Data Fabric 为混合云加速数据保护与应用程序性能
NetApp(纳斯达克股票代码: NTAP )近日宣布NetApp Data Fabric 已经帮助超过 30 万个系统和软件部署获得更加出色的数据管理能力。凭借包括 NetApp® SolidFire® Element® OS、StorageGRID® Webscale、ONTAP® 及 OnCommand® Insight 在内的各项关键组件,Data Fabric 将帮助更多用户释放数据潜力。这些解决方案提供了一致的集成混合云数据服务,能够帮助客户加速处理和保护数据,降低成本并轻松构建下一代数据中心架构。 IDC Group 企业级存储、服务器和基础架构软件事业群副总裁 Laura DuBois 表示:“混合 IT 环境
[网络通信]
瑞萨着手与Avnet展开战略合作——两强联盟,强化瑞萨在华客户基础
  瑞萨科技(Renesas Technology)公司是世界上最大的半导体公司之一,也是全球最大的微控制器(MCU)供应商。近日,瑞萨同世界最大半导体分销商之一Avnet公司旗下的电子元件部(Avnet Electronics Marketing)亚洲区就瑞萨中国地区业务签署战略合作协议。   自从瑞萨由日立制作所和三菱电机的半导体部门合并成立以来取得了引人瞩目的业绩,不仅建立了装配厂、IC设计公司和系统解决方案公司,还设有九个销售中心。此次通过和Avnet建立战略合作关系,瑞萨将利用Avnet在中国分布广泛的分销网络,从而开拓更多新用户,扩大其在中国市场的  占有率。   “Avnet在中国业务覆盖范围广泛,有强大的销售网
[焦点新闻]
机器人革命:LabVIEW满足新兴市场的需求
      机器人已经成为日常生活的一部分。   机器人可以打扫客厅地板、装备复杂的车辆,自主完成军事侦查任务。它们能够完成对人类而言单调、肮脏或是危险的任务,为政府、国防、医疗、农业、矿业、空间和许多其他行业服务。   尽管有着这样的功绩,行业专家认为创新加速只是刚刚开始,在下一个十年中,机器人行业将会成为最快成长的行业之一。在Bill Gates的《科学美国人》一文《普及到家庭的机器人》中,他说机器人行业正在像30年前计算机行业发展的方式发展。使用例如多核处理和现场可编程门阵列(FPGA)等强大技术,机器人构建者能够利用更小、更快、更便宜的计算机处理。它们还可以从更多的商业销售(COTS)传感器中进行选择,从低成本的红
[安防电子]
油料电导率仪自动检定的方法
  1.LabVIEW编程原理及GPIB接口   1.LabVIEW编程原理   LabVIEW软件采用可视化编程语言进行编程。该软件采用了大量的模块化编程工具以及数据流显示和程序流显示,使编程和调试过程非常方便直观。在开放的LabVIEW软件环境下,控制软件与测量设备的链接变得简单。另外,LabVIEW软件还具有大量的数学运算工具,有很好的界面设计和丰富的显示方式。   1.2GPIB接口   GPIB接口是一种并行接口总线,该总线具有数据传送速度快、有效数据率高、驱动能力和抗干扰能力强的优点。通信距离可以达到20m,总线可以挂接15台仪器或设备,最高传输速率可以达到8MB/s。   2.油料电导率仪自动检定原理   采
[测试测量]
油料电导率仪自动检定的方法
专利流氓VirnetX碰瓷苹果成功 获赔4.4亿
   2013年,一家名为VirnetX的公司向美国德克萨斯州法院起诉,称苹果的FaceTime等产品中使用的安全通信协议侵犯了其视频专利,并要求索赔3.68亿美元。随后因为种种原因,该诉状始终处在搁置阶段。 VirnetX称FaceTime侵犯了专利   近日,美国德克萨斯州法院就此案件正式宣判,判决苹果公司向VirnetX支付近4.4亿美元的专利费,并驳回了苹果的上诉。而苹果也成为了继微软之后VirnetX“碰瓷成功”的第二家国际巨头科技公司。   另外,此次判决结果或许会引发其他科技公司的顾虑,因为高额的赔偿金可能会作为未来的赔偿标准。外媒称此事件对科技行业来说弊远远大于利,美国德克萨斯州法院的做法显然是偏袒了专利流氓公司
[手机便携]
利用LabVIEW实时模块缩减F-35战斗机的测试成本与时间
便携式数字数据采集系统(PDDAS)使用了LabVIEW实时模块和PXI,以控制风洞测试和采集记录来自128个不同通道的空气压力数据 "通过LabVIEW实时模块,可以在各种操作情况下获得采集空气压力数据及向风洞提供反馈控制信号所需的确定性响应时间。" – Dave Scheibenhoffer, G Systems 挑战: 用一个可采集、分析和存储来自下一代喷气式战斗机引擎设计的动态压力数据的系统,来替换洛克希德马丁航空公司的一个专用的基于VME的DSP 系统。 解决方案: 利用业界标准的、现成可用的技术,其中包括PXI、MXI、UDP 和RAID,以及LabVIEW实时模块,创建一个满足严格技术要求的、紧密集成
[嵌入式]
LabVIEW的VXI总线的产生
  VXI (VME eXtension for Instrumentation)总线是指VME(VersaModule Eurocard)总线对于仪器的扩展。1987年VXI仪器总线问世,它是由Colorado Datasystem、Hewlett-Packard、RacaldanaInstruments、Tektronix、Wavetek 5家公司组成的联合体共同提出的总线规范,并于1992年被IEEE批准为IEEE-1155标准。   VXI总线基于计算机中广为使用的VME总线,把计算机总线和仪器总线结合在一起,具有PC结构特色和VME总线特色,实现了计算机控制模块化仪器系统的构想,是一种典型的模块化仪器总线。VXI总线一出现
[测试测量]
全新Netduino 3登陆Mouser 新增Wi-Fi连接功能 助力快速建立原型
贸泽电子(Mouser Electronics) 开始分销Netduino 3电子平台,能够使商业硬件解决方案和个人电子项目快速上市,同时提供了最大的设计灵活性并降低了风险。最新版本的开源Netduino平台不但具有让先前版本广受欢迎的最佳功能,还增加了Wi-Fi连接功能。 Mouser分销的 Netduino 3为针对Microsoft .NET Micro Framework而设计的开源电子平台,结合了高级编码的便利性与STM32 F4系列微控制器的原始功能集。Netduino 3基板型采用搭载168MHz ARM Cortex-M4处理器的32位STM32F427VG 微控制器(内置可实现读写同步的1MB双区
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
最新测试测量文章
换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved