C# 计算枚举参数

C# 计算枚举参数,c#,asp.net,enums,C#,Asp.net,Enums,我有两个枚举和一个将枚举作为参数的方法。它们称为ABC和DEF,方法称为TestMethodEnum myEnum。代码如下: public enum ABC { Zero = 0, One = 1, Two = 2 }; public enum DEF { Three = 3, Four = 4, Five = 5 }; public int TestEnum(Enum myEnum) { int returnValue = ???

我有两个枚举和一个将枚举作为参数的方法。它们称为ABC和DEF,方法称为TestMethodEnum myEnum。代码如下:

public enum ABC
{
    Zero = 0,
    One = 1,
    Two = 2
};

public enum DEF
{
    Three = 3,
    Four = 4,
    Five = 5
};

public int TestEnum(Enum myEnum)
{
    int returnValue = ??? // How do I get the value out of this enum that can be either ABC or DEF?
    bool randomTestBool = returnValue > 3;
    return returnValue
}

public void CallerFunction()
{
    int whatsMyInt = TestEnum(DEF.Four);
}
从CallerFunction调用TestEnum函数,并传入两个以上枚举中的一个。我需要找出如何获得整数格式的值,以便在函数中进行比较。现在,如果这是一个枚举的单一类型,即如果函数是TestEnumDEF myDefEnum,那么这将很容易,但是,该函数需要处理多个枚举类型。多亏了前面的回答,我了解到要获得枚举类型,我可以做以下两件事之一:

1 bool isThisDef=myEnum是DEF;但我很好奇是否有比为每种枚举类型创建场景更通用的方法。也许是这样的

2 Type myEnumType=myEnum.GetType;但我不知道现在该怎么办。非常感谢您的帮助顺便说一下,string testString=myEnum.toString;生成一个错误:\

您只需编写

public int TestEnum(Enum myEnum)
{
    return (int)(object)myEnum;
}
int returnValue = (int)(object) myEnum;
你只要写

int returnValue = (int)(object) myEnum;

我猜这种行为不太可靠,因为它可能会在.Net的后续版本中更改,但它也会返回基本值:

int returnValue = myEnum.GetHashCode();

注意:即,不要这样做…

我想这种行为不太可靠,因为它可能会在.Net的后续版本中更改,但它也会返回基本值:

int returnValue = myEnum.GetHashCode();
注意:即不要这样做…

您可以尝试:

int returnValue = Convert.ToInt32(myEnum);
我认为更好的选择是将ABC和DEF显式声明为整数类型:

public enum ABC : int
{
    Zero = 0,
    One = 1,
    Two = 2
};

public enum DEF : int
{
    Three = 3,
    Four = 4,
    Five = 5
};
然后只需使用int returnValue=intmyEnum;。 为了安全起见,您必须检查提供的枚举的类型,这样性能增益将很小(如果有的话),除非您可以保证可以传入的所有枚举都基于整数类型,否则不需要进行检查。

您可以尝试:

int returnValue = Convert.ToInt32(myEnum);
我认为更好的选择是将ABC和DEF显式声明为整数类型:

public enum ABC : int
{
    Zero = 0,
    One = 1,
    Two = 2
};

public enum DEF : int
{
    Three = 3,
    Four = 4,
    Five = 5
};
然后只需使用int returnValue=intmyEnum;。
为了安全起见,您必须检查提供的枚举的类型,这样性能增益将很小(如果有的话),除非您可以保证所有可以传入的枚举都基于整数类型,否则不需要检查。

为什么中间转换为对象?@EricJ。为了避免无法将类型“System.Enum”转换为“int”,虽然这些答案无疑会起作用,但我建议您问问自己,如果要将多个枚举类型值转换为int值,您是否有正确的数据表示形式?我确实可以证明这一点。我看了两个答案,LB包括了造成所有差异的物体。谢谢你们两位,虽然我会在15分钟的限制解除后检查答案是否正确,但我会给你们两位投票。感谢你们两位在枚举数和值方面的快速速成课程:在这一点上,你们最好使用Convert.ToInt32myEnum。为什么中间转换为object?@EricJ。为了避免无法将类型“System.Enum”转换为“int”,虽然这些答案无疑会起作用,但我建议您问问自己,如果要将多个枚举类型值转换为int值,您是否有正确的数据表示形式?我确实可以证明这一点。我看了两个答案,LB包括了造成所有差异的物体。谢谢你们两位,虽然我会在15分钟的限制解除后检查答案是否正确,但我会给你们两位投票。非常感谢你们为我们提供了一个快速的枚举数和值速成课程:此时,您最好使用Convert.ToInt32myEnum。现在您只需重复我的答案。不,我们在3秒钟之内就发布了。我更正了我的答案。是的,在你从另一个答案中学到正确答案后,你更正了你的答案。这没什么错。所以这不是一个竞赛,而是一个学习和分享正确答案的地方。有两个选择,删除和编辑。这两种方法都会导致获得正确的信息,你做出了选择。现在你只需重复我的答案。不,我们在3秒钟内互相发布。我更正了我的答案。是的,在你从另一个答案中学到正确答案后,你更正了你的答案。这没什么错。所以这不是一个竞赛,而是一个学习和分享正确答案的地方。有两个选择,删除和编辑。这两种情况都会导致获得正确的信息,这是你自己的选择。