当尝试通过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();
...
}
}
答案 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());
没有其他方法可以将值类型数组转换为对象数组,在这种情况下你无法利用数组协方差,因为它只能在两者之间起作用兼容引用类型的数组。