使用反射发射构建匿名类型

时间:2015-09-23 15:11:25

标签: c# linq nhibernate reflection.emit

由于nhibernate linq提供程序中的错误,我必须在运行时以dinamically方式生成一个匿名类型,以便将其用作匿名类型的groupby methodcall表达式。

类似

myQueryable.GroupBy(x=> new {x.Prop1, x.Prop2}).Select(x=> 
    new {x.Key.Prop1, x.Key.Prop2, Cnt = x.Count()
   );

我必须生成new {x.Prop1, x.Prop2}匿名类型。

到目前为止,我已经能够在动态程序集中创建常规类型并创建使其运行所需的所有LINQ表达式,但生成的sql与使用Anonymous类型生成的sql不同。

对于匿名类型与常规类型部分,两个表达式树完全相同。

另外,我必须补充一下,如果我将一个静态编译的类组合在一起,nh中显示的同样令人讨厌的错误。

所以我认为用反射发射而不是常规类型来创建一个非常好的类型会更好。有可能吗?

修改

添加我在生成的IL和在匿名类型中生成的IL之间看到的差异。 这是一个以anoymous类型生成的get访问器:

.method public hidebysig specialname instance !'<Age>j__TPar' 
        get_Age() cil managed
{
  // Code size       11 (0xb)
  .maxstack  1
  .locals init (!'<Age>j__TPar' V_0)
  IL_0000:  ldarg.0
  IL_0001:  ldfld      !0 class '<>f__AnonymousType0`2'<!'<Age>j__TPar',!'<Name>j__TPar'>::'<Age>i__Field'
  IL_0006:  stloc.0
  IL_0007:  br.s       IL_0009
  IL_0009:  ldloc.0
  IL_000a:  ret
} // end of method '<>f__AnonymousType0`2'::get_Age

那是我生成的那个:

.method public hidebysig specialname instance int32 
        get_Age() cil managed
{
  .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) 
  // Code size       11 (0xb)
  .maxstack  1
  .locals init (int32 V_0)
  IL_0000:  ldarg.0
  IL_0001:  ldfld      int32 UserQuery/MyDinType::'<Age>k__BackingField'
  IL_0006:  stloc.0
  IL_0007:  br.s       IL_0009
  IL_0009:  ldloc.0
  IL_000a:  ret
} // end of method MyDinType::get_Age

但是,我无法确定那些我不理解的差异与我的问题有关。

0 个答案:

没有答案