C#调用COM组件时,经常会遇到Variant类型参数的方法,比如Variant返回值、Variant传入参数等。如果用IDE的工具将COM组件导入为互操作类,则这些类型会被转换为object型,在这里object和COM的variant类型确实很像:表示不确定具体的类型。
一般情况下,解决办法如下:
对于传入参数和引用传递参数(ref参数),调用方(C#代码片段)应该创建正确类型的变量,然后放在参数表对应的位置;
对于传出参数(out参数)和返回参数,声明一个object类型的变量来接收,然后转换为正确的类型;
小弟现在在调用安捷伦示波器时,有一方法是
GetWaveformData ( channel, points, time, data )说明:
channel As Agt54600_AnalogChannels sets the analog channel. (channel为该库自己定义的类型)
points As Agt54600_WaveformPoints sets the number of points contained in Data.
time As Variant returns the time, in seconds, for the x-axis of the waveform data.
data As Variant contains the waveform data.VB编程序
Private Sub ChaiJi(channel As Integer, tmpData As Variant, tmpTime As Variant)
'定义采集过程,参数为通道,数据,时间
        Agt54600Scope1.GetWaveformData channel, Points, tmpTime, tmpData   
        rows = UBound(tmpData, 1)  
        ReDim data(rows, 1)
        ' now put the time and volt data into the array of variants
        ' this is not necessary with the method GetAllWaveformData
        For i = 1 To rows
            data(i, 0) = tmpTime(i)
           
            data(i, 1) = tmpData(i)
        Next i   
        MSHFlexGrid1.Col = channel
        For j = 1 To rows
            MSHFlexGrid1.Row = j
            MSHFlexGrid1.Text = tmpData(j)
        Next j
    
        MSHFlexGrid1.Refresh
        
        'CWGraph1.Plots(2).PlotY dTime1
        CWGraph1.Plots(channel).PlotY tmpData
        MaxVol = Agt54600Scope1.Measure.MaxVoltage(channel)
        Call getFrequence(tmpTime(0), tmpTime(1999) )   
End Sub
回传数据的tempTime或者tempDate是数组,VB里直接有VARIENT类型,直接表示tmpTime(0)就行
                                         C#里OBJECT类型,直接表示tmpTime[0]不行??? 我想问的是,用C#,调用该方法:用OBJECT代替VARIENT
  public object MY_DATA1;
  public object MY_TIME1;
axAgt54600Scope1.GetWaveformData(my_channel, my_point, ref MY_DATA1,ref MY_TIME1);
经过此方法后,我如何将MY_DATA1和MY_TIME1表示成数组形式。或者如何取其中的元素。

解决方案 »

  1.   

    了解一下C# 装箱拆箱原理;
    应该:
    DateTime dt=(DateTime)tmpTime[0]
      

  2.   

    楼上测试结果:无法将[]索引用于“object”类型。装箱和拆箱原理:
    int i = 123;
    object o = (object) i;  // boxing 然后,可以对对象 o 取消装箱并将其赋值给整型变量 i:C#  复制代码 
    o = 123;
    i = (int) o;  // unboxing 
    本问题装箱时候应该是从设备回传了一个数组,而且不知道数组元素具体类型。
    收到数据后,拆箱就成问题了??按楼上的说法就是:(假设回传的数据是LONG型
    long data = (long)MY_DATA1[0];
    但是这样依然不对!!
      

  3.   

    啊哦, long[] data = (long[])MY_DATA1;这样拆居然通过了。