【问题标题】:dart How to get an enum with index?dart 如何获取带索引的枚举?
【发布时间】:2018-07-21 03:02:26
【问题描述】:

我定义了一个枚举:

enum TestEnum {
  test1,
  test2,
}

我想用索引创建一个枚举:

E buildEnum<E extends ?????????????????>(int index) {
  try {
    return E.values[index];
  }
  catch(e) {
    return null;
  }
}

我不知道枚举的类型。

【问题讨论】:

标签: generics enums dart


【解决方案1】:
enum A { a0, a1, a2 }
A.values[index]

【讨论】:

  • 索引是从零开始还是从1开始?
  • 这是一个普通的数组。所以,它将从 0 开始
【解决方案2】:

您不能对类型参数进行静态访问,因此这不起作用。

除了反射 (dart:mirrors) 之外,没有其他方法可以从一个值转到其类型的静态成员。

【讨论】:

    【解决方案3】:

    我知道你的意思,但它似乎不受支持。至少你可以覆盖它:

    enum YourEnum { a1, a2, a3 }
    enum AnotherEnum { b1, b2, b3 }
    
    abstract class ToolsEnum<T> {
      T getEnumFromString(String value);
    }
    
    class YourClass with ToolsEnum<YourEnum> {
      @override
      YourEnum getEnumFromString(String value) {
        return YourEnum.values
            .firstWhere((e) => e.toString() == "YourEnum." + value);
      }
    }
    
    class AnotherClass with ToolsEnum<AnotherEnum> {
      @override
      AnotherEnum getEnumFromString(String value) {
        return AnotherEnum.values
            .firstWhere((e) => e.toString() == "AnotherEnum." + value);
      }
    }
    

    【讨论】:

      【解决方案4】:

      我知道这是一个老问题,至少现在似乎不可能返回 E ,其中 E 是通用的 enum ,但我正在使用此代码:

      static dynamic asEnumValue(List<dynamic> enumValues, int index) {
          try {
            return enumValues[index];
          } catch (err) {
            return null;
          }
        }
      

      这只是让您不必每次都检查 index 是否是您的 Enum 类型的正确值。 如果你传递了正确的值,你仍然可以使用枚举属性,比如它的索引。

      当然,如果你没有传递正确的枚举值,你会得到一个TypeError

      使用示例(DartPad):

      enum Test {
        a,
        b,
        c
      }
      
      dynamic asEnumValue(List<dynamic> enumValues, int index) {
          try {
            return enumValues[index];
          } catch (err) {
            return null;
          }
        }
      
      Test aTest;
      Test nullTest1;
      Test nullTest2;
      
      
      void main() {
        
        aTest = asEnumValue(Test.values, 0);
        nullTest1 = asEnumValue(Test.values, -1);
        nullTest2 = asEnumValue(Test.values, null);
        
        print(aTest);
        print(nullTest1);
        print(nullTest2);
        
        print(aTest?.index);
        print(nullTest1?.index);
        print(nullTest2?.index);
      }
      

      输出:

      Test.a
      null
      null
      0
      null
      null
      

      【讨论】:

        【解决方案5】:
        enum My {a, b, c}
        

        并添加一个扩展类

        extension MyExt on My {
            @overrride
            int get index {
              if(this == SS.a)
                return 1;
              else if(this == SS.b)
                return 2
              else return 3;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2015-06-16
          • 2011-09-06
          • 1970-01-01
          • 2011-10-05
          • 1970-01-01
          • 1970-01-01
          • 2018-08-17
          • 2017-08-01
          • 1970-01-01
          相关资源
          最近更新 更多