2012-08-28 24 views
2

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

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

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

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

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

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

+1

你应该知道,即使你这样做,它也不会改变传入你的函数的Enum的值。你想做什么? – Random832

+1

顺便说一句,它可能有助于澄清你的意思是“对枚举的引用”。为了直接引用该值,您需要知道该类型(即使它是通用方法中的“T”);否则,你可能使用了一个* boxed copy *的引用,而不是原来的值本身 –

+0

这是生命宇宙和所有事物的答案!要使用枚举你需要知道他们的设计,你可以找到它。 Downvote浪费时间。 – MrFox

回答

1

你需要知道枚举的Type运行,即使你不编译时知道它 - bacause Enum是装箱的值,并以框,你需要获得的东西类型(以便.GetType()返回正确的东西);例如,在运行时这样做:

public Enum GetEnumValue(Type type) { 
    return (Enum)Enum.ToObject(type, 42); 
} 
+0

感谢您的有用答案马克。这个问题是由于我考虑扩展一些现有的代码而引起的(请参阅我在问题中的编辑3),并且您已经确认它无法完成。 –

+2

@AndyJohnson注意:如果你实际上有'SomeFunc (ref T值)',那么它可能*可以*仍然可以完成,但可能需要'ILGenerator'去做 –

2

请注意,这不是真正能够改变物体本身的价值,但你可以得到相同类型的新对象。根据你想要做什么,这可能不适合你。你想做什么?

e = Enum.ToObject(e.GetType(),42) 

好吧,你可以在这里做的最好的事情,我觉得是:

void SetTo42<T>(out T e) { 
    e = (T)Enum.ToObject(typeof(T), e); 
} 

这是想要做的,虽然是很奇怪的事情,所以我不得不问无论你是否应该重新考虑你的设计。


好了,我要出去肢体和猜测你正在尝试做的 - 我假设你的“枚举E”来自使用的GetValue,因此你有一个字段信息(或的PropertyInfo )

void SetFieldTo42(Object obj, FieldInfo f) { 
    f.SetValue(obj,Enum.ToObject(f.FieldType, 42)); 
} 
+0

谢谢!不幸的是,使用Enum.ToObject()不适合我所要做的事情,因为要设置的枚举是更大数据结构的一部分。我已经编辑过这个问题。 –

+0

当你在做'SetValue'时,你需要'Enum.ToObject'吗? – Gabe

+0

@加贝邓诺。尝试 - 我怀疑它会失败,没有它,因为你试图将值设置为错误的类型(System.Int32) – Random832