您的位置 首页 发布

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

误入歧途的一天。昨天晚上我看见http:digitalnicompublicnsfallkbDC41DCDA972642CF8625787E00732DDD说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。

上图有一点需求留意。“调用节点”不只能够调用一般的办法,也能够调用类的静态办法。详细做法便是类实例的输入端口什么也不接,然后在节点的右键菜单中挑选相应的类名。类型挑选的时分要留意,假如要用System.String, System.Int32, 以及System.Type这些类型时,要去mscorlib中找,挑选器列出来的项目中没有这些,如下图所示:

现在咱们得到了没有填充类型参数的Dictionary,如安在没有言语支撑的情况下填充参数呢(C#等.NET言语供给了言语支撑能够用比如Dictionary这样的语法)?答案便是MakeGenericType。类型目标的MakeGenericType办法的参数为Type[],数组中的类型目标将用来填充泛型类的类型参数,回来填充之后的详细类型。
为了结构一个Type[],我一开端用的办法是System.Array的CreateInstance,但是发现它在LabVIEW中不能转化成Type[],因而也无法传递给MakeGenericType。终究找到的处理办法是运用LabVIEW自带的数组类型,往里面增加.NET的类型目标即可,LabVIEW会主动把它转化成Type[],如下图所示:

上面的程序终究生成了一个
System.Collections.Generic.Dictionary
的实例。
有了一个类型目标,怎样生成类的实例?答案是System.Activator。把生成的类型目标作为参数传递给Activator的静态办法CreateInstance,咱们即可得到类的实例,如下图所示:

上面的试验就像一场画中有诗的游览,但是别快乐得太早,真实的噩梦从现在才开端。经过CreateInstance生成的
System.Collections.Generic.Dictionary
的实例会被当成System.Object,这是由CreateInstance回来值类型决议的。在C#中,咱们能够用一个强制类型转化,把它转化成Dictionary,但是LabVIEW中好像做不到这一点,即便供给了“类型转化”节点,但是并不能作咱们需求的转化。
LabVIEW把咱们的Dictionary作为Object,咱们无法运用“调用”节点来调用Dictionary的办法了。这个问题怎样处理?答案便是Reflection,使用类型目标的GetMethod办法获取MethodInfo,再经过MethodInfo的Invoke办法完成办法的调用。真实费事之处在于,Invoke需求传入一个System.Object[],作为调用办法的参数。因而,为了调用办法,咱们还需求首要结构这个参数列表。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/211812.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部