在枚举结构中评分。
var y=1;
var x= (Grade)y;
我正在尝试做与上述行相同的事情,但使用动态 CLASSNAME。
FieldInfo field = typeof(Person).GetField("Grade");
var x= Convert.ChangeType(y ,field.FieldType);
我试过了。这工作正常,但不适用于枚举。
在枚举结构中评分。
var y=1;
var x= (Grade)y;
我正在尝试做与上述行相同的事情,但使用动态 CLASSNAME。
FieldInfo field = typeof(Person).GetField("Grade");
var x= Convert.ChangeType(y ,field.FieldType);
我试过了。这工作正常,但不适用于枚举。
我认为问题在于您访问枚举字段的方式。枚举字段是静态的。默认情况下,该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
,就像在你的例子中一样。