我有一个枚举,它是一个对象的成员变量。我不知道枚举的确切类型,只知道它是从System.Enum派生的。我想设置枚举的基础数值。换句话说:
Enum e;
// ...
e = 42; // Doesn't comple这个是可能的吗?它可以通过反射来完成吗?
编辑1:枚举是较大数据结构的一部分,因此不适合使用Enum.ToObject()创建新值。
编辑2:阐明枚举是对象的成员变量。
编辑3:由于一些评论者要求更多上下文,这里有一个摘要:我有一些通用代码,应该将UI控件(文本框等)与对象数据模型中的相应字段相关联。当UI更改时,模型也会更新,反之亦然。我正在考虑将其扩展到组合框和枚举之间的映射;其中枚举将被设置为所选组合条目的索引。从枚举的基础值设置选定的项很简单,但问题恰恰相反。我相当确定这是不可能的,但我认为这是值得一问的。
发布于 2012-08-28 22:17:22
你需要在运行时知道枚举的Type,即使你在编译时不知道-因为Enum是一个装箱的值,为了装箱某些东西,你需要有访问类型的权限(以便.GetType()返回正确的东西);例如,在运行时这样做:
public Enum GetEnumValue(Type type) {
return (Enum)Enum.ToObject(type, 42);
}发布于 2012-08-28 22:17:43
请注意,实际上不可能更改对象本身的值,但您可以获得相同类型的新对象。根据你想要做的事情,这可能对你不起作用。你想做什么?
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));
}https://stackoverflow.com/questions/12161259
复制相似问题