属性/方法内联和对reflection的影响

关于SO的问题之一的回答是由Valentin Kuzub评论的,他认为通过JIT编译器内联属性将导致reflection停止工作。

案件如下:

class Foo { public string Bar { get; set; } public void Fuzz(Expression<Func> lambda) { } } Fuzz(x => x.Bar); 

Fuzz函数接受lambda表达式并使用reflection来查找属性。 这是HtmlHelper扩展中MVC的常见做法。

即使Bar属性被内联,我也不认为reflection将停止工作,因为它是对Bar的调用,内联和typeof(Foo).GetProperty("Bar")仍将返回有效的PropertyInfo

你能否证实这一点,或者我对方法内联的理解是错误的?

JIT编译器在运行时运行,不能重写存储在程序集中的元数据信息。 并且reflection读取程序集以访问此元数据。 所以JIT编译器对reflection没有影响。

编辑:实际上有几个地方,C#编译器本身在编译期间“内联”了一些信息。 例如,常量,枚举和默认参数是“内联的”,因此您无法在reflection期间访问它们。 但它绝对与你的具体情况无关。

是的当我想到它更多我想只有内联属性可能会失败INotifyPropertyChanged接口正确的工作将是如果你使用基于reflection的方法使用像

 public Count { get {return m_Count;} set { m_Count=value; GetCurrentPropertyNameUsingReflectionAndNotifyItChanged();} } 

如果按照您的建议使用,确实存在元数据中的元数据,并且将从那里成功获取属性名称。

让我们两个都在想。

我个人同意@Sergey:

考虑到内联发生在JIT编译器端,但是之前生成的元数据,它不应该以任何方式影响reflection。 顺便说一下,好问题,就像它+1

表达式树无论如何都不能内联,因为它们是表达式(抽象语法树)的表示而不是表达式本身。

代表即使可以进行内联,仍会传递有关在其属性中调用的方法和目标的数据。