2013-04-25 127 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