首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >设置System.Enum的基础值

设置System.Enum的基础值
EN

Stack Overflow用户
提问于 2012-08-28 22:15:07
回答 2查看 167关注 0票数 2

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

代码语言:javascript
运行
复制
Enum e;
// ...
e = 42;  // Doesn't comple

这个是可能的吗?它可以通过反射来完成吗?

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-28 22:17:22

你需要在运行时知道枚举的Type,即使你在编译时不知道-因为Enum是一个装箱的值,为了装箱某些东西,你需要有访问类型的权限(以便.GetType()返回正确的东西);例如,在运行时这样做:

代码语言:javascript
运行
复制
public Enum GetEnumValue(Type type) {
    return (Enum)Enum.ToObject(type, 42);
}
票数 1
EN

Stack Overflow用户

发布于 2012-08-28 22:17:43

请注意,实际上不可能更改对象本身的值,但您可以获得相同类型的新对象。根据你想要做的事情,这可能对你不起作用。你想做什么?

代码语言:javascript
运行
复制
e = Enum.ToObject(e.GetType(),42)

好吧,你能做的最好的事情,我想,是:

代码语言:javascript
运行
复制
void SetTo42<T>(out T e) {
    e = (T)Enum.ToObject(typeof(T), e);
}

然而,这是一件非常奇怪的事情,所以我不得不问你是否应该重新考虑你的设计。

好了,我要冒险一试,猜猜你想做什么--我假设你的"Enum e“来自于使用GetValue,因此你有一个FieldInfo (或PropertyInfo)

代码语言:javascript
运行
复制
void SetFieldTo42(Object obj, FieldInfo f) {
    f.SetValue(obj,Enum.ToObject(f.FieldType, 42));
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12161259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档