关于SO的问题之一的answer由Valentin Kuzub评论,他认为JIT编译器内联属性将导致反射停止工作。
案例如下:
class Foo
{
public string Bar { get; set; }
public void Fuzz<T>(Expression<Func<T>> lambda)
{
}
}
Fuzz(x => x.Bar);
Fuzz
函数接受lambda表达式并使用反射来查找属性。这是HtmlHelper
扩展中MVC的常见做法。
我认为即使Bar
属性被内联,反射也不会停止工作,因为它是对Bar
的调用,它将被内联并且typeof(Foo).GetProperty("Bar")
仍然会返回有效的PropertyInfo
。
您能否确认一下,或者我对方法内联的理解是错误的?
答案 0 :(得分:3)
JIT编译器在运行时运行,不能重写存储在程序集中的元数据信息。并且反射读取程序集以访问此元数据。因此,JIT编译器对反射没有影响。
编辑: 实际上,当C#编译器本身在编译期间“内联”某些信息时,有几个地方。例如,常量,枚举和默认参数是“内联的”,因此您无法在反射期间访问它们。但这绝对与你的具体情况无关。
答案 1 :(得分:1)
是的,当我考虑更多时,我想只有内联属性可能会失败INotifyPropertyChanged界面正确的工作将是如果你使用像
这样的基于反射的方法public Count
{
get {return m_Count;}
set { m_Count=value;
GetCurrentPropertyNameUsingReflectionAndNotifyItChanged();}
}
如果按照你的建议使用,汇编中确实存在元数据,那么将从那里成功获取属性名称。
让我们两个都在想。
答案 2 :(得分:0)
我个人同意@Sergey:
考虑到内联在JIT编译器端发生,但之前生成的元数据,它不应该以任何方式影响反射。顺便说一下,好的问题,比如+1
答案 3 :(得分:0)
表达式树无论如何都不能内联,因为它们是表达式(抽象语法树)的表示而不是表达式本身。
代表,即使它们可以被内联,仍然会传递有关在其属性中调用的方法和目标的数据。