首先,常量是一个字段,所以需要从字段中获取该值。
但是需要传入的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;
}