3
在我的项目某些属性的形式(X => x.property)表达出来在运行时(X =>转换(x.property)),如下所示:LINQ表达式得到转换函数插入
它取决于属性类型,double和DateTime似乎是罪魁祸首。适用于字符串属性(例如,Speed和ForeColour都是字符串)
为什么会出现这种方式?
在我的项目某些属性的形式(X => x.property)表达出来在运行时(X =>转换(x.property)),如下所示:LINQ表达式得到转换函数插入
它取决于属性类型,double和DateTime似乎是罪魁祸首。适用于字符串属性(例如,Speed和ForeColour都是字符串)
为什么会出现这种方式?
double
和DateTime
是值类型。基本上,编译器使用Expression.Convert
来表示装箱操作。
string
已经是引用类型,所以不需要转换。
你可以看到同样的事情在正常代码:
double d = 0.5;
string s = "hello";
object o1 = d;
object o2 = s;
...编译成:
// d = 0.5
IL_0001: ldc.r8 0.5
IL_000a: stloc.0
// s = "hello"
IL_000b: ldstr "hello"
IL_0010: stloc.1
// o1 = d - boxing!
IL_0011: ldloc.0
IL_0012: box [mscorlib]System.Double
IL_0017: stloc.2
// o2 = s - no boxing required!
IL_0018: ldloc.1
IL_0019: stloc.3
谢谢你这么多乔恩。有没有一种方法可以用泛型来接受这些表达式,因为“Expression> test1 =(x => x.GpsDateTime);”但我无法接受这些列表。像“List >>属性”就是我打算使用的。 –
basarat
2013-02-25 22:41:55
想通了一种方式:而不是接受一个列表。我应该设计一个流畅的API来添加每个表达式,然后每个函数调用都可以被泛型驱动。谢谢。 – basarat 2013-02-25 22:52:00