【发布时间】:2014-04-28 21:06:17
【问题描述】:
我有一个扩展方法,它曾经采用强类型 Expression<Func<>> 参数,但出于实现原因,我不得不将其更改为使用弱类型版本。这对表达式参数产生了奇怪的影响,因为它现在似乎将 lambda 表达式包装在对“Convert”方法的显式调用中。
以前的参数看起来像:
m => m.Data
现在它看起来像下面这样:
m => Convert(m.Data)
我已使用以下示例代码复制了该问题:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;
namespace ConsoleApplication
{
static class Program
{
static void Main(string[] args)
{
Model model = new Model()
{
Data = 123
};
Test(m => m.Data, m => m.Data);
Console.ReadLine();
}
public static void Test<TProperty>(Expression<Func<Model, TProperty>> strongTyped, Expression<Func<Model, object>> weakTyped)
{
Console.WriteLine("Strong Typed: {0}", strongTyped);
Console.WriteLine("Weak Typed: {0}", weakTyped);
}
}
public class Model
{
public int Data
{
get;
set;
}
}
}
其输出如下:
Strong Typed: m => m.Data
Weak Typed: m => Convert(m.Data)
我猜这与将值类型自动装箱为对象类型有关。任何人都可以确认这一点或有人知道发生了什么吗?还有谁知道 Convert 方法是在哪里声明的?
在弱类型表达式上调用 compile 方法会得到以下结果:
weakTyped.Compile().Method
{System.Object lambda_method(System.Runtime.CompilerServices.Closure, ConsoleApplication.Model)}
[System.Reflection.Emit.DynamicMethod.RTDynamicMethod]: {System.Object lambda_method(System.Runtime.CompilerServices.Closure, ConsoleApplication.Model)}
base {System.Reflection.MethodBase}: {System.Object lambda_method(System.Runtime.CompilerServices.Closure, ConsoleApplication.Model)}
MemberType: Method
ReturnParameter: null
ReturnType: {Name = "Object" FullName = "System.Object"}
ReturnTypeCustomAttributes: {System.Reflection.Emit.DynamicMethod.RTDynamicMethod.EmptyCAHolder}
【问题讨论】: