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

时间:2013-03-01 23:49:29

标签: c# .net-4.0

我有一个包含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[]。< / p>

3 个答案:

答案 0 :(得分:21)

如果它真的是object[],你不能只是施放数组。您可以非常轻松地 创建一个新数组:

var enumArray = originalArray.Cast<DriveRates>().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[]时,

答案 1 :(得分:1)

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

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;
}

答案 2 :(得分:-1)

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

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