繁体   English   中英

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

[英]How to convert an Enum which is a generic parameter to another Enum?

我有一些枚举

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;

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

采用:

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

鉴于以下枚举

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

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

BasicEnum basicEnum = (BasicEnum)(object)someEnum;

如果我了解您的需求,我会选择var success = BasicEnum.TryParse(someEnum.ToString(), out basicEnum)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM