2016-02-25 20 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或调用方法在用户定义的转换存在时执行自定义转换。这种方式表达镜将由编译器生成的实际代码。

相关问题