C#:传递特定枚举类型的数组作为params object []参数

时间:2015-06-14 03:49:18

标签: c# arrays enums

当尝试通过params object []传入特定NoMethodError in Japas#index Showing /Users/vvd/Desktop/japacounter/app/views/japas/index.html.erb where line #20 raised: undefined method `created_at' for #<User:0x007f981a4536e8> Extracted source (around line #20): <% @users.each do |user| %> <tr> <td><%= user.japas.created_at %></td> <td><%= user.japas.rounds %></td> <td> / 16 </td> 类型的数组作为函数参数时,我无法传入实际数组而不首先转换为object []。但是如果我这样做,我就无法访问原始的enum类型。

鉴于下面显示的enum和函数,这很好用:

enum

但是,这会失败,因为它无法隐式转换为对象,因此它将数组作为第一个参数传递而不是单个参数:

var works = SomeFunction(Season.Fall, Season.Winter);

它也无法转换为object [],因为之后它无法确定原始类型。如何使用预定的数组传递它?

var seasons = new Season[] {Season.Fall, Season.Winter};
var fail = SomeFunction(seasons);

...

[Flags]
public enum Season : byte
{
    None = 0,
    Spring = 1,
    Summer = 2,
    Fall = 4,
    Winter = 8
}

更新:它可以将Season []数组转换为object [],但这看起来很好看:

public Something SomeFunction(params object[] values) 
{
     ...
     foreach (var value in values)
     {
          var type = value.GetType();
          ...
     }
}

4 个答案:

答案 0 :(得分:1)

它就像转换包含枚举的object []一样简单,而不是转换数组:

Destroy(clone, 2f); // Destroy clone 2 seconds from now

是的,最终将函数签名更改为通用是最好的,但不适用于我的情况(第三方API)。

答案 1 :(得分:0)

此代码在.NET 3.5,4.0和4.5中编译。在构建时是否收到编译器错误?

class Program
{
    static void Main(string[] args)
    {
        var p = new Program();
        p.SampleFunc(Seasons.Winter, Seasons.Fall);
    }

    void SampleFunc(params object[] elements)
    {
        foreach(var element in elements)
        {
            if (element is Seasons)
            {
                // do something.
            }
        }
    }

    enum Seasons
    {
        Winter, Spring, Summer, Fall
    }
}

答案 2 :(得分:0)

我认为这样做......

  public enum MyEnum
{
EnumValue1,
EnumValue2,
EnumValue3
}
class Program
{
    static void Main(string[] args)
    {
        var TheEnumList =( from list in Enum.GetValues(typeof (MyEnum)).Cast<int>()
            select new {EnumValueInstance = (MyEnum) list}).ToList();
        TheEnumList.ForEach(enumItem => Console.WriteLine(enumItem.EnumValueInstance));
        var result = SomeFunction(TheEnumList);
        Console.WriteLine(result);
        Console.ReadKey();
    }

    public static MyEnum SomeFunction(params object[] values)
    {
        dynamic obj = values[0];
        return obj[0].EnumValueInstance;
    }
}

答案 3 :(得分:0)

考虑使用Cast<>() LINQ方法而不是for循环,这看起来更清晰:

var seasons = SomeFunction(seasons.Cast<object>().ToArray());

没有其他方法可以将值类型数组转换为对象数组,在这种情况下你无法利用数组协方差,因为它只能在两者之间起作用兼容引用类型的数组。