【发布时间】:2021-08-28 10:16:49
【问题描述】:
有没有办法在vala中将字符串转换为枚举:
string foo = "Enum1";
MY_ENUM theEnum = MY_ENUM.get_value_by_name(foo);
enum MY_ENUM {
Enum1,
Enum2,
Enum3
}
所以在本例中,“theEnum”的值为:MY_ENUM.Enum1
【问题讨论】:
有没有办法在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 和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;
}
}
【讨论】: