C# 如何将枚举作为参数传递
可能重复:C# 如何将枚举作为参数传递,c#,silverlight,enums,C#,Silverlight,Enums,可能重复: 我想出了一个方便的小函数,它可以让我得到一个枚举的计数(我知道它不能正确地处理所有的枚举)。与其将枚举硬编码到函数中,这样我就必须为每个要使用它的枚举编写一个seprate函数,我想将枚举作为参数传入,但我很难弄清楚如何做到这一点 代码如下: private enum MyColors { Red, Green, Blue } private Int32 GetEnumCount() { Int32 i = 0; while
我想出了一个方便的小函数,它可以让我得到一个枚举的计数(我知道它不能正确地处理所有的枚举)。与其将枚举硬编码到函数中,这样我就必须为每个要使用它的枚举编写一个seprate函数,我想将枚举作为参数传入,但我很难弄清楚如何做到这一点 代码如下:
private enum MyColors { Red, Green, Blue }
private Int32 GetEnumCount()
{
Int32 i = 0;
while (Enum.IsDefined(typeof(MyColors), (MyColors)i))
{
i++;
}
return i;
}
更新 我最后得出了这个答案:
private Int32 GetEnumCount(Type enumType)
{
Int32 i = 0;
while (Enum.IsDefined(enumType, i))
{
i++;
}
return i;
}
您应该将enum
类型
作为参数,并删除对(MyColors)
的强制转换
在非Sliverlight中,您也可以将函数替换为
Enum.GetValues(typeof(MyEnum)).Length
这是可以做到的,但是需要做一些额外的工作才能使它与非常用枚举一起工作:
private static ulong GetEnumContiguousCount(Type enumType)
{
var underlyingType = Enum.GetUnderlyingType(enumType);
ulong i;
for (i = 0; Enum.IsDefined(enumType, Convert.ChangeType(i, underlyingType, null)); ++i) {}
return i;
}
演示:作为替代方案(尽管这显然已经得到了回答),如果您以0开始第一个,然后在末尾添加一个名为count的,那么您可以使用它,例如:
enum MyColour
{
Blue = 0,
Red,
Green,
ColourCount
}
-1用于在编辑中复制我的答案@诺尔多林:我在你之前写了这个答案,在看到你的答案之前我写了编辑。不,当我发布我的答案时,你没有写,你的
Enum.GetValues
位不包括在内。30秒后我刷新了,结果是。您甚至调用了完全相同的枚举类型……请注意Silverlight标记。Silverlight中没有针对Enum的getValues。-9999您都复制了Enum.getValues()上的文档。真丢脸!!!顺便说一句,该页面上第二高的答案是我推荐的答案。这种方法只适用于枚举值连续的情况。标志
属性化枚举通常在使用的整数中有间隙,因此此方法将失败。也许您可以解释一下为什么需要它?这是一个需要记住的有用的+1:需要处理不同的底层类型是有意义的,但是返回ulong
不需要,int
就可以了,而且会更容易使用。@AnthonyWJones:您可能是对的,但我没有同时查找枚举的最大成员数。