如何将作为通用参数的枚举转换为另一个枚举?

时间:2013-11-27 14:31:15

标签: c# .net generics enums type-conversion

我有一些枚举

enum BasicEnum
{
    BasicValue1,
    BasicValue2
    //...
}

我想要的是与

类似的东西
public void Foo<TEnum>(TEnum someEnum)
    where TEnum : struct, IComparable, IFormattable, IConvertible
{
    switch (someEnum)
    {
        case BasicEnum.BasicValue1:
            //...
            break;
        case BasicEnum.BasicValue2:
            //...
            break;
    }
}

所有TEnum类型仅包含BasicEnum中显示的值。

当然这些代码没有被编译,所以我试着把它改成这个:

public void Foo<TEnum>(TEnum someEnum)
    where TEnum : struct, IComparable, IFormattable, IConvertible
{
    BasicEnum basicEnum = (BasicEnum)someEnum;

    switch (basicEnum)
    {
        //...
    }
}

正如我所料,我再次出现错误'无法将类型'TEnum'转换为'BasicEnum''

找到像

这样的技巧并不困难
var value = Convert.ToInt32(someEnum);
var basicValue = (BasicEnum)value;

但是这个解决方案似乎并不是我喜欢的那个。有没有更好的办法?

4 个答案:

答案 0 :(得分:2)

使用:

( BasicEnum )Enum.ToObject( typeof( BasicEnum ), someEnum )

答案 1 :(得分:1)

给出以下枚举

public enum FirstEnum
{
    FirstEnum1,
    FirstEnum2,
    FirstEnum3
}

public enum SecondEnum
{
    SecondEnum1,
    SecondEnum2,
    SecondEnum3
}

您可以通过执行以下操作将第二个枚举转换为第一个枚举。

SecondEnum secEnum = SecondEnum.SecondEnum2;

FirstEnum firstEnum = (FirstEnum)Enum.ToObject(typeof(FirstEnum), secEnum);

firstEnum现在将等于FirstEnum2

您还可以创建一个通用方法将您的枚举转换为BasicType(即FirstEnum)

public FirstEnum ConvertToFirstEnum(object enumToConvert)
{
    FirstEnum value = (FirstEnum)Enum.ToObject(typeof(FirstEnum), enumToConvert);
    return value;
}

并按以下方式调用该函数:

FirstEnum firstEnum = ConvertToFirstEnum(SecondEnum.SecondEnum3);

firstEnum的值将等于FirstEnum3

答案 2 :(得分:0)

它不是最漂亮的,但你可以使用(添加适当的强化检查):

BasicEnum basicEnum = (BasicEnum)(object)someEnum;

答案 3 :(得分:0)

如果我明白你需要的话,我会和var success = BasicEnum.TryParse(someEnum.ToString(), out basicEnum)一起去。