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

时间:2011-07-14 10:34:08

标签: c# reflection inlining

关于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

您能否确认一下,或者我对方法内联的理解是错误的?

4 个答案:

答案 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)

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

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