【发布时间】:2018-11-30 19:08:10
【问题描述】:
我想为这个问题提供上下文。我已经看到了独特的解决方案,人们创建将从 SharedPreferences 而不是支持字段读取/写入的委托。对字符串执行此操作,例如:
class SharedPrefsString(private val sharedPrefs: SharedPreferences) {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return sharedPrefs.getString(property.name, "")
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
sharedPrefs.edit().putString(property.name, value).apply()
}
}
var myString: String by SharedPrefsString(myPrefs)
但是,我希望我可以对通用枚举做同样的事情,因为所有枚举都有一个 valueOf(string) 方法,但下面的方法不起作用。我在 cmets 中放了一些我尝试过的东西:
class SharedPrefsEnum<T : Enum<T>>(private val sharedPrefs: SharedPreferences) {
operator fun getValue(thisRef: Any?, property: KProperty<*>): T {
// Doesn't work, can't reference T, which makes sense.
// return T.valueOf(sharedPrefs.getString(property.name, ""))
// Can't use reified type here, which makes sense.
// return enumValueOf<T>(sharedPrefs.getString(property.name, ""))
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
sharedPrefs.edit().putString(property.name, value.name).apply()
}
}
var myEnum: MyEnum by SharedPrefsEnum(myPrefs)
这样的事情可能吗?
【问题讨论】:
-
您可能需要获取
Class或KClass。但是,不支持具体的类级泛型,因此您必须手动完成。不过可能有更好的方法 -
@Zoe 一旦我有对类的引用,我能做什么?弄清楚如何用反射调用“valueOf”?
-
IIRC,
valueOf是静态的,所以你可以尝试使用反射来获取方法,然后调用它。使用Class或KClass应该很简单,但您可能会得到SecurityException。我没有太多地接触反射,所以我不熟悉如何正确避免这些 -
@Zoe 感谢您为我指明正确的方向。 :)