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