给定一个对象形式的未知基元类型数组,将其转换为双数组 C#

Given an unknown primitive type array in the form of an object, convert it to double array C#

提问人:Lanet Rino 提问时间:4/24/2023 最后编辑:Lanet Rino 更新时间:4/24/2023 访问量:60

问:

我在这里搜索了以前的问题,但没有任何东西能完全回答我正在寻找的问题。

我正在使用 PropertyInfo 以类型对象的形式通过反射检索基元类型的数组。

    Type t = typeof(MyType);    
    PropertyInfo pi = t.GetProperty("Property Name");

    object primitiveTypeArray = pi.GetValue(myObject)

    double[] convertedArray = (double[])primitiveTypeArray; 

这个数组只有 3 种类型(目前),double、float 或 ulong。 convertedArray 的这种赋值仅在 primitiveTypeArray 对象包含 double[] 时有效,但如果它是 ulong[] 的 float[],则失败。

我发现 Array 类和 Convert 类有一些可能会有所帮助的帮助程序函数,但我无法理解如何适当地使用它们来解决这个问题。

谢谢

c# 阵 列 基元类型

评论

0赞 Ahmed Alayat 4/24/2023
你能发布错误消息吗?
0赞 Lanet Rino 4/24/2023
System.InvalidCastException:“无法将类型为”System.UInt64[]“的对象转换为类型”System.Double[]“,如果我尝试强制转换浮点数,则会抛出 System.InvalidCastException:”无法将类型为“System.Single[]”类型的对象转换为“System.Double[]”。
1赞 Jeroen Mostert 4/24/2023
由于 a 不能表示 的所有可能值,并且从 转换产生的值在转换为十进制表示时具有明显更高的精度(尽管不会丢失任何位),因此请记住,此类转换可能会丢失。根据您计划对数据执行的操作,您可能只需要三个单独的计算路径。doubleulongfloat
0赞 Lanet Rino 4/24/2023
很好的观点,感谢您提出这一考虑。希望一切都应该没问题,因为 ulong 值被截断并代表数百万,因此在给定的应用上下文中永远不应达到双精度的限制,但它确实表明在分配之前需要进行一些检查
0赞 Pieterjan 4/24/2023
它需要是 ?在 .NET 7 中,他们引入了可以在此处使用的接口。如果你确实需要一个 ,请使用doubleINumberdoubleConvert.ChangeType<double[]>(input)

答:

2赞 Dmitry Bychenko 4/24/2023 #1

如果您只有类型,为什么不检查所有这些可能性呢?3

using System.Linq;

...

object primitiveTypeArray = pi.GetValue(myObject)

double[] convertedArray = 
    primitiveTypeArray is double[] da ? da
  : primitiveTypeArray is float[] fa ? fa.Select(item => (double) item).ToArray()
  : primitiveTypeArray is ulong[] ua ? ua.Select(item => (double) item).ToArray()
  : null; // or throw exception here

请注意,我们不能只投射到,但可以创建所需的.float[]double[]double[]

评论

0赞 Lanet Rino 4/24/2023
谢谢,这解决了我的问题。我想我试图用艾哈迈德·阿拉亚特(Ahmed Alayat)建议的单一陈述使其尽可能精简,但即使这样也抛出了例外。