Enum結構中的等級。c#將從FieldInfo獲取的值轉換爲
var y=1;
var x= (Grade)y;
我正在嘗試做與上面的行相同的事情,但是使用動態的CLASSNAME。
FieldInfo field = typeof(Person).GetField("Grade");
var x= Convert.ChangeType(y ,field.FieldType);
我試過了。這工作正常,但不是枚舉。
Enum結構中的等級。c#將從FieldInfo獲取的值轉換爲
var y=1;
var x= (Grade)y;
我正在嘗試做與上面的行相同的事情,但是使用動態的CLASSNAME。
FieldInfo field = typeof(Person).GetField("Grade");
var x= Convert.ChangeType(y ,field.FieldType);
我試過了。這工作正常,但不是枚舉。
我認爲問題在於您訪問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
強制轉換,就像你的例子。
謝謝,它成功地訪問了該字段。但是我從'System.Int32'轉換爲'Project1.Grade'。 – nullException 2013-04-25 23:19:52
@nullException,請參閱更新 – smartcaveman 2013-04-25 23:21:26
謝謝 我的模型有字段不屬性(get; set;) – nullException 2013-04-25 23:27:29