枚举结构中的等级。
var y=1;
var x= (Grade)y;
我正在尝试与上面的行做同样的事情,但使用动态CLASSNAME。
FieldInfo field = typeof(Person).GetField("Grade");
var x= Convert.ChangeType(y ,field.FieldType);
我试过了。这种方法很好但不适用于枚举。
答案 0 :(得分:0)
我认为问题在于您访问枚举字段的方式。枚举字段是静态的。默认情况下,Type.GetField
方法使用等同于BindingFlags.Public|BindingFlags.Instance
的绑定标志。这与枚举成员不匹配。
如果这是您遇到的问题,那么您可以使用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
演员表,就像你的例子一样。