我有一个枚举,它是一个对象的成员变量。我不知道枚举的确切类型,只是它来自System.Enum
。我想设置枚举的基础数值。换句话说:
Enum e;
// ...
e = 42; // Doesn't comple
这可能吗?可以用反射来完成吗?
编辑1:枚举是较大数据结构的一部分,因此使用Enum.ToObject()创建新值是不合适的。
编辑2:澄清了枚举是对象的成员变量。
编辑3:由于一些评论者要求更多上下文,因此有一个摘要:我有一些通用代码,它应该将UI控件(文本框等)与对象数据模型中的相应字段相关联。当UI更改时,模型会更新,反之亦然。我正在考虑扩展它以在组合框和枚举之间进行映射;将枚举设置为所选组合条目的索引。从枚举的基础值设置所选项是微不足道的,但与此相反的是问题发生的地方。我很确定这是不可能的,但我认为值得一提。
答案 0 :(得分:2)
请注意,实际上不可能更改对象本身的值,但是您可以获得相同类型的新对象。根据您的尝试,这可能不适合您。你想做什么?
e = Enum.ToObject(e.GetType(),42)
好吧,我认为你能做的最好的事情是:
void SetTo42<T>(out T e) {
e = (T)Enum.ToObject(typeof(T), e);
}
但这是一件非常奇怪的事情,所以我不得不问你是否应该重新考虑你的设计。
好的,我将会出去探究你想要做什么 - 我假设你的“Enum e”来自于使用GetValue,你因此拥有一个FieldInfo(或PropertyInfo)
void SetFieldTo42(Object obj, FieldInfo f) {
f.SetValue(obj,Enum.ToObject(f.FieldType, 42));
}
答案 1 :(得分:1)
你需要知道运行时的枚举Type
,即使你不知道编译时 - bacause Enum
是一个盒装值,为了打包你需要访问该类型的东西(以便.GetType()
返回正确的东西);例如,在运行时执行此操作:
public Enum GetEnumValue(Type type) {
return (Enum)Enum.ToObject(type, 42);
}