0

在枚举结构中评分。

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

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

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

我试过了。这工作正常,但不适用于枚举。

4

1 回答 1

0

我认为问题在于您访问枚举字段的方式。枚举字段是静态的。默认情况下,该Type.GetField方法使用等效于BindingFlags.Public|BindingFlags.Instance. 这与枚举成员不匹配。

如果这是您遇到的问题,那么您可以使用在名为“Person”的枚举类型上typeof(Person).GetField("Grade",BindingFlags.Public|BindingFlags.Static)获取FieldInfo名为“Grade”的字段。这假设您的模型如下所示:

 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,就像在你的例子中一样。

于 2013-04-25T23:00:00.060 回答