c# & lt; dynamic>强制转换或转换
本文关键字:转换 dynamic lt | 更新日期: 2023-09-27 18:10:26
我正在用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()转换/gh>
- 使用CopyTo将整个列表的内容复制到
<double>
列表。
我有点不明白。
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));
在你调用你的方法之前你的List<object> data
必须不是空的。如果你做Console.WriteLine(data.Last());
而不是Console.WriteLine(data[0])
,你肯定会得到结果
列表中的第一项是双精度数组。如果您希望看到该数组的值被打印出来,您可以手动遍历它们,或者如果对象是数组,则可以使用以下代码打印数组项,否则仅打印项值。
if (data[0].GetType().IsArray)
{
Console.WriteLine(string.Join(",", ((Array)data[0]).Cast<object>()));
}
else
{
Console.WriteLine(data[0]);
}