首页 > 解决方案 > 如何使类型明确地转换为任何枚举

问题描述

我有

struct MyType
{
   public int value;
}

我如何定义一个explicit运算符,以便它可以转换为 any enum?“任何”是指存在的任何枚举。

如果“可转换为任何可能的枚举”函数是一个int而不是一个struct包含的,则它已经是可能的int。例如,我总是可以(AnyEnum)myType.value(SomeOtherEnum)myType.value。但我希望能够在(AnyEnum)myType不挖掘int内部的情况下直接进行。我的想法是自然地,implicit以某种方式将整个事情视为int. 但不幸implicit的是不支持泛型,所以我必须为implicit我希望支持的每个枚举定义。

如果这涉及到 C# 7.3 的Enum通用约束的一些使用,那很好。但似乎即使有约束,我where T : Enum也无法int通过。("无法将类型转换为)T(T)valueintT

一个示例用例:

if(myValue.something == something)
{
   switch((MyEnum)myValue)
   {
       case MyEnum.A : ...
       case MyEnum.B : ...
   }
}
else if(myValue.something == something)
{
   switch((MyOtherEnum)myValue)
   {
       case MyOtherEnum.A : ...
       case MyOtherEnum.B : ...
   }
}

另一个,

if(myValue.ValidInEnum<MyEnum>(out MyEnum validEnum)) //converted from inside with some additional logic
{
   switch(validEnum)
   {
       case MyEnum.A : ...
       case MyEnum.B : ...
   }
}

标签: c#

解决方案


如果您想直接从枚举转换而不是访问结构的“值”成员,是的,有可能,这里有一个例子:

static void Main(string[] args)
{
    MyType myType;
    myType.value = 1;
    MyEnum myEnum = (MyEnum) myType;
    Console.WriteLine(myEnum);
    Console.ReadLine();
}

enum MyEnum
{
    a = 0,
    b = 1
}

struct MyType
{
    public int value;

    public static explicit operator MyEnum(MyType myType)
    {
        return (MyEnum)myType.value;
    }
}

输出是:

b

如果您想从任何类型的枚举直接转换为您的结构,我认为这是不可能的,您可以按照其他答案中的建议查看泛型,或者为您的类型编写一个小扩展助手:

public static class MyTypeExtensions
{
    public static T ToAnyEnum<T>(this MyType myType)
    {
        return (T)Enum.ToObject(typeof(T), myType.value);
    }
}

然后你可以写:

MyType myType;
myType.value = 1;
MyEnum myEnum = myType.ToAnyEnum<MyEnum>();
MyOtherEnum myOtherEnum = myType.ToAnyEnum<MyOtherEnum>();

推荐阅读