[英]Property / Method inlining and impact on Reflection
Valentin Kuzub 評論了我對 SO 問題之一的回答,他認為 JIT 編譯器內聯屬性將導致反射停止工作。
案例如下:
class Foo
{
public string Bar { get; set; }
public void Fuzz<T>(Expression<Func<T>> lambda)
{
}
}
Fuzz(x => x.Bar);
Fuzz
function 接受 lambda 表達式並使用反射來查找屬性。 這是 MVC 在HtmlHelper
擴展中的常見做法。
我認為即使Bar
屬性被內聯,反射也不會停止工作,因為它是對Bar
的調用,它將被內聯並且typeof(Foo).GetProperty("Bar")
仍將返回有效的PropertyInfo
。
您能否確認一下,或者我對方法內聯的理解是錯誤的?
JIT 編譯器在運行時運行,它不能重寫存儲在程序集中的元數據信息。 反射讀取程序集以訪問此元數據。 所以 JIT 編譯器對反射沒有影響。
編輯:實際上有幾個地方 C# 編譯器本身在編譯期間“內聯”了一些信息。 例如,常量、枚舉和默認 arguments 是“內聯”的,因此您無法在反射期間訪問它們。 但這絕對與您的特定情況無關。
是的,當我更多地考慮它時,我想只有內聯屬性可能會失敗的方法 INotifyPropertyChanged 接口正確的工作是如果您使用基於反射的方法,例如
public Count
{
get {return m_Count;}
set { m_Count=value;
GetCurrentPropertyNameUsingReflectionAndNotifyItChanged();}
}
如果像您建議的那樣使用,則程序集中確實存在元數據,並且將從那里成功獲取屬性名稱。
讓我們倆都在思考。
我個人同意@Sergey:
考慮到內聯發生在 JIT 編譯器端,但之前生成的元數據,它不應該以任何方式影響反射。 順便說一句,好問題,喜歡它+1
表達式樹無論如何都不能內聯,因為它們是表達式(抽象語法樹)的表示,而不是表達式本身。
委托,即使它們可以內聯,仍將在其屬性中攜帶有關被調用的方法和目標的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.