C# 设置System.Enum的基础值

C# 设置System.Enum的基础值,c#,C#,我有一个枚举,它是一个对象的成员变量。我不知道枚举的确切类型,只知道它来自System.Enum。我想设置枚举的基础数值。换言之: Enum e; // ... e = 42; // Doesn't comple 这可能吗?这可以通过反思来实现吗 编辑1:枚举是较大数据结构的一部分,因此使用enum.ToObject()创建新值不合适 编辑2:阐明枚举是对象的成员变量 编辑3:由于一些评论者要求提供更多的上下文,这里有一个摘要:我有一些通用代码,应该将UI控件(文本框等)与对象数据模型中的相

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

Enum e;
// ...
e = 42;  // Doesn't comple
这可能吗?这可以通过反思来实现吗

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

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


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

您需要在运行时知道枚举的
类型,即使您在编译时不知道它-因为
enum
是一个装箱值,为了装箱,您需要有权访问该类型(以便
.GetType()
返回正确的内容);例如,在运行时执行此操作:

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

请注意,实际上不可能更改对象本身的值,但可以获得相同类型的新对象。取决于你想做什么,这可能不适合你。你想干什么

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

好吧,我认为你在这里能做的最好的事情是:

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

您应该知道,即使这样做,它也不会更改传入函数的枚举值。你想做什么?顺便说一句,这可能有助于澄清“引用枚举”的含义。要直接引用该值,您需要知道类型(即使它只是泛型方法中的
T
);否则,你可能是在引用一个盒装副本,而不是原始值本身——它是生命、宇宙和一切的答案!要使用枚举,您需要了解它们的设计,您可以找到以下内容。对浪费的时间进行向下投票。当您将其作为
Enum
传递时,您已经在较大的数据结构之外创建了一个副本。您需要重新设计您的函数以获取byref T.@MrFox感谢您的否决票和非常有用的评论。谢谢!不幸的是,使用Enum.ToObject()不适合我正在尝试的操作,因为要设置的Enum是更大数据结构的一部分。我编辑了这个问题来说明这一点。在执行
SetValue
时是否需要
Enum.ToObject
?@Gabe Dunno。试试看-我怀疑如果没有它,它会失败,因为您试图将值设置为错误的类型(System.Int32)。不,它对我来说很好。我想只有.NET1反射不会给枚举分配整数。谢谢你的回答。这个问题源于我考虑扩展一些现有代码(请参见问题中的编辑3),而您已经确认它无法完成。@AndyJohnson注意:如果您确实有一个
SomeFunc(ref t value)
,那么它可能仍然可以完成,但可能需要
ILGenerator
来完成
void SetFieldTo42(Object obj, FieldInfo f) {
    f.SetValue(obj,Enum.ToObject(f.FieldType, 42));
}