首先,常量是一个字段,所以需要从字段中获取该值。
但是需要传入的BindingFlags是什么,与其盲猜,不如直接反射所有字段值,查看其中的常量有哪些特性和bool值来判断。
...
static void Main(string[] args)
{
var type = typeof(CCCC);
var fields = type.GetFields(BindingFlags.Public | BindingFlags.Static);
}
public class CCCC
{
public const int A = 2;
public static readonly int B = 3;
public static int C = 4;
}
...
在获取fields后打上断点,可得到如下结果
截图过大,截取部分
字段A:
字段B:
字段C:
对比上述图可知,
常量的BindingFlags特性依然是Public|Static,字段特性(FieldAttributes)为Public|Static|Literal|HasDefault,且field.IsLiteral为true,这个属性表示是否在编译时确定值且后续不可改变,因此可以通过字段特性来确定该字段是否为常量;
常规静态变量则仅有Public|Static(不论是BindingFlags还是FieldAttributes);
而静态只读变量,则在FieldAttributes中额外多一段InitOnly标记。
综上所述,要获取常量字段,则可以直接通过反射静态字段的方式获取字段后,判断是否有Literal特性,则可以返回值,伪代码如下
public static FieldInfo GetConstantField(Type type, string fieldName)
{
var field = type.GetField(fieldName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
if (field.Attributes.HasFlag(FieldAttributes.Literal | FieldAttributes.HasDefault))
{
return field;
}
return null;
}