设置System.Enum的基础值

时间:2012-08-28 14:15:07

标签: c#

我有一个枚举,它是一个对象的成员变量。我不知道枚举的确切类型,只是它来自System.Enum。我想设置枚举的基础数值。换句话说:

Enum e;
// ...
e = 42;  // Doesn't comple

这可能吗?可以用反射来完成吗?

编辑1:枚举是较大数据结构的一部分,因此使用Enum.ToObject()创建新值是不合适的。

编辑2:澄清了枚举是对象的成员变量。

编辑3:由于一些评论者要求更多上下文,因此有一个摘要:我有一些通用代码,它应该将UI控件(文本框等)与对象数据模型中的相应字段相关联。当UI更改时,模型会更新,反之亦然。我正在考虑扩展它以在组合框和枚举之间进行映射;将枚举设置为所选组合条目的索引。从枚举的基础值设置所选项是微不足道的,但与此相反的是问题发生的地方。我很确定这是不可能的,但我认为值得一提。

2 个答案:

答案 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);
}