2012-08-28 53 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