【发布时间】:2012-10-16 18:10:20
【问题描述】:
我注意到当我反映到程序集中时,对属性访问器的调用有时看起来像方法
// "Reflected" example
class Class1 {
public bool Boolean { get; set;}
}
class Class2 {
public Class2() {
var class1 = new Class1();
var boolean = class1.get_Boolean();
}
}
现在我很好奇,我在Class1 中放了一个类似签名的方法,看起来像是访问器的标准约定。
// "Hacked" example
class Class1 {
public bool get_Boolean() { return true; }
}
不知何故,C# 编译器仍然将get_Boolean 视为一种方法。
让方法成为属性的秘诀是什么?
【问题讨论】:
-
最有可能的是,没有
spoon酱可以使它起作用:当您通过反射 API 查看它们时,两者的表示方式不同,因此其中可能有一些元数据区分两者的程序集。 -
最神奇的是编译器生成的 .property IL 指令。并且为 getter 方法生成的 specialname 属性,您的 get_Boolean 方法两者都没有。你可以用 ildasm.exe 看到它
-
当您说“反射”等时,您是指 RedGate Reflector 吗?它是对 每个 属性的访问执行此操作,还是仅对某些属性执行此操作?
-
@AakashM 其 resharper 的自动反编译。
-
有趣的是,我会将您所看到的内容归类为反编译器中的错误(通常 dotPeek 似乎可以毫无问题地确定是否正在调用属性或方法)
标签: c# clr syntactic-sugar