c#转换从FieldInfo获得的值

时间:2013-04-25 22:47:40

标签: c#-4.0

枚举结构中的等级。

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

我正在尝试与上面的行做同样的事情,但使用动态CLASSNAME。

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

我试过了。这种方法很好但不适用于枚举。

1 个答案:

答案 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演员表,就像你的例子一样。