将整数数组转换为枚举数组

我有一个有4个值的枚举:

public enum DriveRates { driveSidereal = 0, driveLunar = 1, driveSolar = 2, driveKing = 3 } 

我有一个值数组,我想要转换为DriveRates数组。 但是当我做var rates = (DriveRates[])ret;ret是一个数字对象数组(可能是整数),它表示Unable to cast object of type 'System.Object[]' to type 'ASCOM.DeviceInterface.DriveRates[]'.

ret = {0,1,2,3} 。 我应该怎么做呢。 再次,我试图将枚举值数组转换为枚举数组……好吧,值:)但我正在尝试从类型object[]转换为类型DriveRates[]

你不能只是强制转换数组,如果它真的是一个object[] 。 您可以很容易地创建一个新数组:

 var enumArray = originalArray.Cast().ToArray(); 

如果它实际上是一个int[]数组,你可以进行转换 – 尽管你必须先与C#编译器进行良好的交谈:

 using System; class Program { enum Foo { Bar = 1, Baz = 2 } static void Main() { int[] ints = new int[] { 1, 2 }; Foo[] foos = (Foo[]) (object) ints; foreach (var foo in foos) { Console.WriteLine(foo); } } } 

C#编译器不相信从int[]Foo[]的转换(并且在C#的规则中没有)…但是CLR对于这种转换是好的,所以只要你能说服C#编译器一起玩(通过先铸造到object )就可以了。

当原始数组实际上是一个object[]时,这不起作用

这是不可能的。 无法在引用类型数组和值类型数组之间进行转换。 您需要手动将元素复制到新数组中

 DriveRates[] Convert(object[] source) { var dest = new DriveRates[source.Length]; for (int i = 0; i < source.Length; i++) { dest[i] = (DriveRates)source[i]; } return dest; } 

…或者使用linq,特别是如果你需要对一行中的每个元素做一些额外的事情:

 DriveRates[] enumArray = originalArray.Select(o => (DriveRates)o).ToArray();