根据微软的文档,如果:
,FieldInfo.GetValue(object)
将抛出NotSupportedException
"一个字段被标记为文字,但该字段没有可接受的文字类型。"
我不知道这是什么意思
"将字段标记为文字。"
我想了解这一点,这样我就可以知道如何防止这种异常
literal
是const
字段。每个const字段的值都是在编译时由字面量初始化确定的。看看这段代码
using System;
using System.Reflection;
public class Program
{
const int literal_int = 5;
readonly int literal_int_two = 5;
const string literal_string = "Fun";
const Random literal_random = null;
int non_literal;
public static void Main()
{
foreach (FieldInfo f in typeof(Program).GetFields(BindingFlags.Instance
| BindingFlags.NonPublic
| BindingFlags.Static
| BindingFlags.FlattenHierarchy))
{
Console.WriteLine("{0} is literal - {1}", f.Name, f.IsLiteral);
try
{
Console.WriteLine("GetValue = {0}", f.GetValue(null));
}
catch{}
}
}
}
输出:literal_int is literal - True
GetValue = 5
literal_int_two is literal - False
literal_string is literal - True
GetValue = Fun
literal_random is literal - True
GetValue =
non_literal is literal - False
然而,,但该字段没有可接受的文字类型之一
是开放的解释,我找不到一个没有"被接受的文字类型之一"(不管这意味着什么)的文字的例子。
通过简单地查看源代码,我找不到一个相对的代码片段来表示这个异常。忽略此子句是安全的。
看看FieldInfo.IsLiteral
属性:
获取一个值,该值指示是否在编译时写入该值并且不能更改。
IsLiteral属性是在fieldatattributes。文字属性。如果设置了此属性,则该字段不能为已更改且为常量。
"一个字段被标记为文字,但该字段没有可接受的文字类型之一。"
…必须与由动态或自定义代码创建的FieldInfo
实例相关(而不是通过Reflection收集),其中通常会延迟或省略某些验证。
FieldInfo
对象包含表示字段的元数据,但是它的类是可继承的,任何派生的实现都可能允许不良的类型条件。