如何创建Parms枚举[]强制到Ints的重载

本文关键字:Ints 重载 枚举 何创建 创建 Parms | 更新日期: 2023-09-27 18:24:16

给定此LinqPad C#程序

void Main() { Test(new [] {(int)Foo.A, (int)Foo.B, (int)Foo.C}); }
// External Library Call
public void Test(IEnumerable values){ values.Dump(); }
public enum Foo { A,B,C }

我想简化Test的调用站点,所以我创建了这个辅助方法:

public void Test(params Foo[] values){
    Test((IEnumerable)values);
}

这让呼叫站点变成了:

Test(Foo.A, Foo.B, Foo.C);

但我很快注意到的输出发生了变化

0
1
2

A
B
C

如何保持params Foo[]签名(因为它使呼叫站点非常干净),但是否将其视为int而非Foo

我已经添加了我的解决方案,但我很想看看是否有一些简单的东西我错过了

如何创建Parms枚举[]强制到Ints的重载

public void Test(params Foo[] values)
{
    var valuesAsInts = values.Select(x => (int)x);
    Test(valuesAsInts);
}

仅仅调用Cast<int>()是不起作用的,所以我创建了另一个helper方法将其转换为object[]

void Main()
{
    Test(Foo.A, Foo.B, Foo.C);  
}
// External Library Call
public void Test(IEnumerable values){
    values.Dump();
}
public enum Foo {
    A,B,C
}
public void Test(params Foo[] values){
    Test(ToObjectArray(values.Cast<int>()));
}
public static object[] ToObjectArray<T>(IEnumerable<T> values)
{
    var array = values.ToArray();
    var objArray = new object[array.Length];
    array.CopyTo(objArray, 0);
    return objArray;
}

现在的输出应该是:

0
1
2