[英]C#: passing in array of a specific Enum type as params object[] argument
当尝试通过 params object[] 将特定enum
类型的数组作为函数参数传递时,我无法在不首先转换为 object[] 的情况下传递实际数组。 但是如果我这样做,我将无法访问原始enum
类型。
鉴于下面显示的enum
和函数,这可以正常工作:
var works = SomeFunction(Season.Fall, Season.Winter);
但是,这失败了,因为它不能隐式转换为对象,因此它将数组作为第一个参数而不是单个参数传递:
var seasons = new Season[] {Season.Fall, Season.Winter};
var fail = SomeFunction(seasons);
它也不能转换为 object[],因为之后它无法确定原始类型。 如何使用预先确定的数组将其传入?
[Flags]
public enum Season : byte
{
None = 0,
Spring = 1,
Summer = 2,
Fall = 4,
Winter = 8
}
...
public Something SomeFunction(params object[] values)
{
...
foreach (var value in values)
{
var type = value.GetType();
...
}
}
更新:它可以将 Season[] 数组转换为 object[],但这似乎很奇怪:
var seasons = new object[original.Length];
for (int i = 0; i < original.Length; i++)
{
seasons[i] = original[i];
}
它就像转换包含枚举的 object[] 而不是转换数组一样简单:
var original = new Season[] {Season.Fall, Season.Winter};
var selectedSeasons = new object[original.Length];
for (int i = 0; i < original.Length; i++)
{
selectedSeasons[i] = original[i];
}
var works = SomeFunctionWithObjectParamsArgs(selectedSeasons);
是的,最终将函数签名更改为通用将是最好的,但不适用于我的情况(第三方 API)。
此代码在 .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
}
}
我认为这样做...
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;
}
}
考虑使用Cast<>()
LINQ 方法而不是 for 循环,这看起来更清晰:
var seasons = SomeFunction(seasons.Cast<object>().ToArray());
没有其他方法可以将值类型数组转换为对象数组,在这种情况下不能利用数组协方差,因为它仅适用于兼容引用类型的数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.