使用反射发出创建构造函数调用,该调用将 Func<> 作为参数传递



我希望有人能指出我在正确的方向与以下问题。

我正在做一个使用反射生成类型的项目。在出现需要将Func<>传递给新对象的构造函数(如下所示)之前,一切都运行良好。

public class SearchTerm : IEntity
{
   private readonly NavigationProperty<Item> _item;
   public SearchTerm()
   {
       _item = new NavigationProperty<Item>(() => ItemIds);
   }
   public string[] ItemIds { get; set; }
}

使用Linqpad,我可以看到IL输出如下:

SearchTerm.<.ctor>b__0:
IL_0000:  ldarg.0     
IL_0001:  call        UserQuery+SearchTerm.get_ItemIds
IL_0006:  stloc.0     // CS$1$0000
IL_0007:  br.s        IL_0009
IL_0009:  ldloc.0     // CS$1$0000
IL_000A:  ret         
SearchTerm..ctor:
IL_0000:  ldnull      
IL_0001:  stloc.0     
IL_0002:  ldarg.0     
IL_0003:  call        System.Object..ctor
IL_0008:  nop         
IL_0009:  nop         
IL_000A:  ldarg.0     
IL_000B:  ldloc.0     
IL_000C:  brtrue.s    IL_001D
IL_000E:  ldarg.0     
IL_000F:  ldftn       UserQuery+SearchTerm.<.ctor>b__0
IL_0015:  newobj      System.Func<System.Collections.Generic.IEnumerable<System.String>>..ctor
IL_001A:  stloc.0     
IL_001B:  br.s        IL_001D
IL_001D:  ldloc.0     
IL_001E:  newobj      UserQuery<UserQuery+Item>+NavigationProperty`1..ctor
IL_0023:  stfld       UserQuery+SearchTerm._item
IL_0028:  nop         
IL_0029:  ret  

我遇到的问题是,我不确定如何在IL中定义委托。

我已经尝试了以下

var method = typeBuilder.DefineMethod("func", MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig | MethodAttributes.Virtual, typeof(IEnumerable<string>), Type.EmptyTypes);
var methodIl = method.GetILGenerator();
methodIl.Emit(OpCodes.Ldarg_0);
methodIl.Emit(OpCodes.Call, dictionary["get_ItemIds"]);
methodIl.Emit(OpCodes.Ret);

然后尝试创建下面的委托抛出"不支持的异常",错误是"派生类必须提供实现"。

var funcType = typeof(Func<,>).MakeGenericType(typeBuilder, typeof(IEnumerable<string>));
method.CreateDelegate(funcType);

我也试过使用委托。CreateDelegate和DynamicMethod,它们都要求在使用它们之前已经创建了类型。

对于我可能做错的地方,任何建议都是非常感谢的。

如果你想调用你的代码,你必须使用Type s和MethodInfo s,而不是TypeBuilder s和MethodBuilder s。

所以,你需要CreateType()然后使用Type和它的方法:

var generatedType = typeBuilder.CreateType();
var funcType = typeof(Func<,>).MakeGenericType(
    generatedType, typeof(IEnumerable<string>));
var d = generatedType.GetMethod("func").CreateDelegate(funcType);

相关内容

  • 没有找到相关文章

最新更新