C# 如何反射获取常量值

        首先,常量是一个字段,所以需要从字段中获取该值。

        但是需要传入的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:

C# 如何反射获取常量值_第1张图片

字段B:

C# 如何反射获取常量值_第2张图片

字段C:

C# 如何反射获取常量值_第3张图片

对比上述图可知,

常量的BindingFlags特性依然是Public|Static,字段特性(FieldAttributes)为Public|Static|Literal|HasDefault,且field.IsLiteral为true,这个属性表示是否在编译时确定值且后续不可改变,因此可以通过字段特性来确定该字段是否为常量;

C# 如何反射获取常量值_第4张图片

常规静态变量则仅有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;
}

你可能感兴趣的:(c#,开发语言,反射,常量)