2

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

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

这可能吗?可以通过反射完成吗?

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

编辑 2:阐明枚举是对象的成员变量。

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

4

2 回答 2

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));
}
于 2012-08-28T14:17:43.163 回答
1

你需要Type运行时知道枚举,即使你在编译时不知道它-Enum因为是一个装箱的值,为了装箱你需要访问类型的东西(这样.GetType()返回正确的东西) ; 例如,在运行时执行此操作:

public Enum GetEnumValue(Type type) {
    return (Enum)Enum.ToObject(type, 42);
}
于 2012-08-28T14:17:21.830 回答