c#<dynamic>转换或转换</dynamic>

时间:2014-06-26 13:33:43

标签: c# type-conversion adc nidaqmx

我正在使用NI ADC做一些工作。我正在读取AO和AI到List<dynamic>的电压,我在console.writeLine上遇到了一些问题。

我正在使用动态类型,因为程序需要在运行时而不是编译时决定应该存储什么数据。

因此,因为每当我想要打印列表的内容时,它都不知道我在问什么,所以它返回存储的类型,而不是所选的元素数据。

public void createTask(DataGrid grid, List<Object> data, float sampleRate, int sampleAmount, ComboBox channel, float minRange, float maxRange)
        {
            using (Task myTask = new Task())
            {
                myTask.AIChannels.CreateVoltageChannel(channel.Text, "",
                    (AITerminalConfiguration)(-1), minRange, maxRange, AIVoltageUnits.Volts); // create the task to measure volts

                myTask.Timing.ConfigureSampleClock("", sampleRate, SampleClockActiveEdge.Rising, // create the timing
                    SampleQuantityMode.ContinuousSamples, sampleAmount);

                AnalogMultiChannelReader reader = new AnalogMultiChannelReader(myTask.Stream);

                myTask.Control(TaskAction.Verify);

                data.Add(reader.ReadSingleSample());

                Console.WriteLine(data[0]);
            }
        }

反过来打印System.Double[]。我将如何打印出元素实际存储的内容而不是其类型?我已经尝试了很多不同的方法来尝试获得我想要的东西,但我正在努力使用C#语法(我使用C ++) - 只使用它三个星期。

我试过了;

  • 铸造
  • ToString()转换
  • 使用CopyTo将整个列表的内容复制到<double>列表。

我在这里有点不知所措。

3 个答案:

答案 0 :(得分:1)

1)您可以迭代数组

 double[] data = new double[] { 1, 2, 3 };
 foreach (var item in data)
       Console.WriteLine(item.ToString());

2)或

 Console.WriteLine(string.Join(",", data)); 

如果你已经有一个double数组,上面的解决方案就可以了。 在您的情况下,如果您确定data [0]是double数组,则可以使用as运算符

double[] temp = data[0] as double[];
Console.WriteLine(string.Join(",", temp));

答案 1 :(得分:1)

在致电您的方法之前,您的List<object> data必须为空。如果您Console.WriteLine(data.Last());代替Console.WriteLine(data[0]),则肯定会得到结果

答案 2 :(得分:1)

所以列表中的第一个项目是double数组。如果要查看打印出的数组中的值,可以手动迭代它们,或者如果对象是数组,则可以使用以下代码打印数组项,否则只需打印项值。

        if (data[0].GetType().IsArray)
        {
            Console.WriteLine(string.Join(",", ((Array)data[0]).Cast<object>()));
        }
        else
        {
            Console.WriteLine(data[0]);
        }