簡體   English   中英

在動態程序集中使用通用參數調用委托(func/action)

[英]Call delegate (func/action) with generic argument in dynamic assembly

我想用通用 class 創建動態程序集:

class TestClass<T> where T : new() {
  public T TestMethod() {
    return f();
  }

  private Func<T> f;
}

因此,我創建了 class,添加了通用參數,設置約束並創建了如下委托:

var fieldType = typeof(Func<>).MakeGenericType(TArg); 
// TArg = testClassBuilder.DefineGenericParameters("T")[0];

然后使用 IL 生成器,我嘗試發出調用Invoke方法:

ilGenerator.Emit(OpCodes.Callvirt, fieldType.GetMethod("Invoke"));

但是我在GetMethod("Invoke")調用上得到NotSupportedException 那么,如何使用Emit調用這個委托呢?

您不能在typeof(Func<>).MakeGenericType(TArg)上調用GetMethod ,因為在這種情況下, TArg是一個GenericTypeParameterBuilder ,並且MakeGenericType返回的Type object 不知道如何獲取相關方法。

而是像這樣使用TypeBuilder.GetMethod

ilGenerator.Emit(
    OpCodes.Callvirt,
    TypeBuilder.GetMethod(
        typeof(Func<>).MakeGenericType(genParam),
        typeof(Func<>).GetMethod("Invoke")
));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM