c# - 为什么可以在 C# 中使用反射读取放置在 const 上的属性?

标签 c# reflection constants

我正在玩反射,偶然我意识到我可以将自定义字段属性放在 const 类变量上,然后(使用反射)我读取类的字段,找到具有该属性的常量并执行操作。这工作正常。

我很好奇为什么它能正常工作。除非我误解了 consts 的工作原理,否则我认为常量是“编译出来的”,并且对该常量的所有引用在编译后都变成了常量的实际值。如果是这样,为什么反射仍然可以看到 const 值?

最佳答案

所有对const引用 都被编译掉了——而不是const 声明本身。编译器将任何 const 声明作为 IL 的一部分发出。

这是一个示例(注意 IL 保留了 const 字段)。

C#:

class Foo
{
    const int i = 0;
}

IL:

.class private auto ansi beforefieldinit Foo
    extends [mscorlib]System.Object
{
    .method public hidebysig specialname rtspecialname instance void .ctor() cil managed
    {
    }


    .field private static literal int32 i = int32(0)    
}

关于c# - 为什么可以在 C# 中使用反射读取放置在 const 上的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5032900/

相关文章:

java - 列出指定类的所有常量

c# - 与泛型一起使用的抽象常量

c# - 无法解析来自 Yahoo! 的 xml梦幻体育与 C#

c# - 从 WPF 中的不同线程更新 UI 控件时出现 "The calling thread cannot access this object because a different thread owns it"错误

java - 安卓/Java : Calling a method using reflection?

c# - 用常量替换表达式中的参数

c# - 当客户错过接受报价的机会时,应该使用什么 HTTP 响应代码

c# - 我可以让标准货币格式使用负号而不是括号吗?

java - 给定 ParameterizedType 和 Type,如何重新参数化第一个类型?

c++ - 将 shared_ptr<T> 转换为 shared_ptr<const T> 会改变它指向的对象吗?