【问题标题】:c# <dynamic> casting or conversionc# <dynamic> 强制转换或转换
【发布时间】:2014-06-26 13:33:42
【问题描述】:

我正在使用 NI ADC 做一些工作。我目前正在将 AO 和 AI 的电压读入List&lt;dynamic&gt;,并且我在使用 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 将整个列表的内容复制到 &lt;double&gt; 列表。

我在这里有点不知所措。

【问题讨论】:

  • 通常您的对象只需覆盖ToString() 方法即可提供有意义的字符串结果。但是在这种情况下,您似乎还存储了这些对象的 集合(特别是数组)。我建议您将打印工作传递给实用程序方法,该方法检查对象是否实现IEnumerable,如果是,则在其上迭代打印每个元素而不是打印集合。
  • 很有趣,虽然我不确定我是否完全理解你刚才所说的。您能否通过检查对象是否实现 IEnumerable 向我解释什么是实用程序方法以及您的意思
  • dynamic 是 C# 中的关键字,不等同于 object。 msdn.microsoft.com/en-ca/library/dd264736.aspx
  • reader.ReadSingleSample() 的返回类型是什么?双[]?

标签: c# type-conversion adc nidaqmx


【解决方案1】:

1)你可以遍历数组

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

2) 或

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

如果您已经有一个双精度数组,则上述解决方案有效。 在您的情况下,如果您确定 data[0] 是一个双精度数组,则可以使用 as 运算符

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

【讨论】:

  • 感谢 foreach 语句很酷,尽管如果我想循环/迭代我的 List 集合,我可以关闭,这仍然会打印出列表集合类型,而不是元素中保存的数据。
  • 啊,你的传奇。快速提问,所以我完全理解你的代码。 as double[]; 我认为将我的 List 集合中的元素 [0] 转换为双精度是正确的吗? string.Join 这个函数实际上是做什么的?我以前从未见过它。谢谢
  • 是的,as 运算符将对象转换为指定的类型。 string.Join 方法接受 2 个参数 a) 分隔符 b) 对象数组并返回 1 个字符串,该字符串是由分隔符分隔的数组值。在我的示例中 1,2,3
  • 啊非常有用!谢谢
【解决方案2】:

在调用方法之前,List&lt;object&gt; data 不能为空。如果你做Console.WriteLine(data.Last());而不是Console.WriteLine(data[0]),你肯定会得到结果

【讨论】:

  • 这将打印出集合类型而不是实际数据,这只是做同样事情的另一种方式。我的List&lt;dynamic&gt;data 收藏目前包含一个元素(A 电压)
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2021-10-22
    • 2020-06-02
    • 2015-09-27
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多