2013-04-25 126 views
0

Enum結構中的等級。c#將從FieldInfo獲取的值轉換爲

var y=1; 
    var x= (Grade)y; 

我正在嘗試做與上面的行相同的事情,但是使用動態的CLASSNAME。

FieldInfo field = typeof(Person).GetField("Grade"); 
    var x= Convert.ChangeType(y ,field.FieldType); 

我試過了。這工作正常,但不是枚舉。

回答

0

我認爲問題在於您訪問enum字段的方式。枚舉字段是靜態的。默認情況下,Type.GetField方法使用等效於BindingFlags.Public|BindingFlags.Instance的綁定標誌。這與enum成員不匹配。

如果這是您遇到的問題,那麼您可以使用typeof(Person).GetField("Grade",BindingFlags.Public|BindingFlags.Static)獲取名爲「Person」的枚舉類型名爲「Grade」的字段FieldInfo。這假設你的模型看起來像:

enum Person 
{ 
    Grade 
} 

還有與代碼兼容的另一個問題是與枚舉兼容。這並不完全明顯,因爲您的示例似乎將「成績」視爲字段和類型。如果我以前的建議沒有描述你的模型,那麼問題是你正在使用Convert.ChangeType,在這種情況下,應該給你一個InvalidCastException

您需要找到一種不同的方法將值轉換爲您的枚舉。如果在編譯時不知道類名,那麼我建議使用linq表達式,例如

Type targetEnumType = typeof(Person).GetField("Grade"); 
ConstantExpression runtimeValue = Expression.Constant(y); 
UnaryExpression cast = Expression.Convert(runtimeValue,targetEnumType); 
LambdaExpression lambda = Expression.Lambda(cast); 
Delegate getTheCastValue = lambda.Compile(); 
object value = getTheCastValue.DynamicInvoke(); 

此代碼假定模型看起來像

class Person 
{ 
    public Grade Grade; 
} 

enum Grade 
{ 
    First = 1, 
    Second = 2 
} 

然而,看着這點,變得明顯,如果Person是一種非通用類,那麼你就必須知道的類型Grade字段在運行時,所以你最好只是做一個(Grade)y強制轉換,就像你的例子。

+0

謝謝,它成功地訪問了該字段。但是我從'System.Int32'轉換爲'Project1.Grade'。 – nullException 2013-04-25 23:19:52

+0

@nullException,請參閱更新 – smartcaveman 2013-04-25 23:21:26

+0

謝謝 我的模型有字段不屬性(get; set;) – nullException 2013-04-25 23:27:29