Vala,要枚举的字符串

Vala, string to enum

有没有办法在 vala 中将字符串转换为枚举:

string foo = "Enum1";
MY_ENUM theEnum = MY_ENUM.get_value_by_name(foo);
enum MY_ENUM {
    Enum1,
    Enum2,
    Enum3
}

因此在此示例中,“theEnum”的值为:MY_ENUM.Enum1

可以使用 GLib 的 GObject 库提供的运行时类型系统。有EnumClass and EnumValue个。这些在运行时提供自省并允许从字符串初始化枚举。

目前语法有点复杂,虽然有人可以修改 Vala 编译器使其更容易,但这是一项重要的工作。

一个例子:

void main () {
    try {
        MyEnum? the_enum_value;
        the_enum_value = MyEnum.parse ("FIRST");
        print (@"$(the_enum_value)\n");
    } catch (EnumError error) {
        print (@"$(error.message)\n");
    }
}

errordomain EnumError {
    UNKNOWN_VALUE
}

enum MyEnum {
    FIRST,
    SECOND,
    THIRD;

    public static MyEnum parse (string value) throws EnumError {
        EnumValue? a;
        a = ((EnumClass)typeof (MyEnum).class_ref ()).get_value_by_name ("MY_ENUM_" + value);
        if (a == null) {
            throw new EnumError.UNKNOWN_VALUE (@"String $(value) is not a valid value for $(typeof(MyEnum).name())");
        }
        return (MyEnum)a.value;
    }
}