2016-02-25 63 views
0

我在尋找解釋而不是解決方案:在這裏我注意到了。 讓我說我有一個方法測試如下使用Expression。由於Func的返回parameter"object",當我打電話的功能與價值型物業(Test<TestClass>(x => x.SomeInt))的,該框架圍繞我的表達成x=> Convert(x.SomeInt).Body不是如果類型MemberExpression了。難道是由於boxing/unboxing?但是這在哪裏被記錄。爲什麼.NET Framework修改調用Convert函數的值類型的表達式?

static void Test<TEntity>(Expression<Func<TEntity, object>> memberExpression) 
    { 
     //if value type, body is Convert(x.SomeInt) 
     var body = memberExpression.Body.ToString(); 
    } 

    class TestClass 
    { 
     public int SomeInt { get; set; } 
     public string SomeString { get; set; } 
    } 

    static void Main(string[] args) 
    { 

     Test<TestClass>(x => x.SomeInt); 
     Test<TestClass>(x => x.SomeString); 
    } 
+0

也是在被定義的轉換函數的主體? –

回答

3

因爲拉姆達的類型是T => object。當你施放值類型爲對象.NET運行時需要做一些工作(創造價值類型的包裝實例),因爲轉換。當您轉換爲引用類型,因爲鑄造RefType的=>對象是無操作應該不會出現。

您可以通過使用Foo<T, TResult>(Expression<Func<T,TResult>> expr)提高你的代碼。

由於表達式可以在運行時編譯並從其結構生成CIL(.NET字節碼),因此它們引入了特殊節點來生成CIL裝箱指令box或調用方法在用戶定義的轉換存在時執行自定義轉換。這種方式表達鏡將由編譯器生成的實際代碼。

相關問題